Assignment 10: String Algorithms

来源:互联网 发布:windows xp系统安装包 编辑:程序博客网 时间:2024/05/17 07:20
  • 1936 All in All (1)

  • 2408 Anagram Groups (2)

  • 2359 Questions (3)

  • 1750 Dictionary (3)

  • 2752 Seek the Name, Seek the Fame (4)

  • 1961 Period (5)

  • 1147 Binary codes (6)

  • 3261 Milk Patterns (6)

  • 2185 Milking Grid (7)

  • 3349 Snowflake Snow Snowflakes (7)

  • 3167 Cow Patterns (8, challenge problem)

  • 2774 Long Long Message (9, challenge problem)


    poj2359

    约瑟夫环

    #include<cstring>#include<cstdio>#include<string>#include<iostream>using namespace std;string str,temp;int main(){    int n=1999,len,i,f;    while(getline(cin,str)){        while(getline(cin,temp)){            str+=temp;        }        len=str.length();        f=0;        for(i=2;i<=len;++i){            f=(f+n)%i;        }        if(str[f]=='?') printf("Yes\n");        else if(str[f]==' ') printf("No\n");        else printf("No comments\n");    }    return 0;}

    poj3261

    后缀数组+二分答案/栈找每个公共前缀的次数

    #include <vector>#include <iostream>#include <string>#include <algorithm>#include <cstring>#include <cstdio>#include <stack>using namespace std;struct SuffixArray {const int L;vector<int> s;vector<vector<int> > P;vector<pair<pair<int,int>,int> > M;SuffixArray(const vector<int> &s) : L(s.size()), s(s), P(1, vector<int>(L, 0)), M(L) {for (int i = 0; i < L; i++) P[0][i] = int(s[i]);for (int skip = 1, level = 1; skip < L; skip *= 2, level++) {P.push_back(vector<int>(L, 0));for (int i = 0; i < L; i++)M[i] = make_pair(make_pair(P[level-1][i], i + skip < L ? P[level-1][i + skip] : -1000), i);sort(M.begin(), M.end());for (int i = 0; i < L; i++)P[level][M[i].second] = (i > 0 && M[i].first == M[i-1].first) ? P[level][M[i-1].second] : i;}}vector<int> GetSuffixArray() { return P.back(); }int LongestCommonPrefix(int i, int j) {int len = 0;if (i == j) return L - i;for (int k = P.size() - 1; k >= 0 && i < L && j < L; k--) {if (P[k][i] == P[k][j]) {i += 1 << k;j += 1 << k;len += 1 << k;}}return len;}};vector <int> a;stack <int> s;#define maxn 20005int cnt[maxn];int p[maxn],h[maxn];/*bool check(int a,int k,int n){int i,tot=0;for(i=0;i<n;++i){if(h[i]>=a) {if(++tot>=k) return 1;}else tot=0;}return 0;}*/int main() {//freopen("d.in","r",stdin);int n,k,i,x,ans=0,t;scanf("%d%d",&n,&k);for(i=0;i<n;++i) {scanf("%d",&x);a.push_back(x);}SuffixArray suffix(a);vector<int> v = suffix.GetSuffixArray();for(i=0;i<n;++i) p[v[i]]=i;// for(i=0;i<n;++i) printf("vi=%d pi=%d\n",v[i],p[i]);for(i=0;i<n-1;++i) h[i]=suffix.LongestCommonPrefix(p[i],p[i+1]);// for(i=0;i<n-1;++i) printf("hi=%d\n",h[i]);/*--k;int l,r,m;l=1;r=h[0];for(i=1;i<n-1;++i) r=max(r,h[i]);r++;while(l+1<r){m=(l+r)>>1;if(check(m,k,n-1)){l=m;}else{r=m;}}printf("%d\n",l);//二分高度,check宽度*/h[i]=0;for(i=0;i<n;++i){if(s.empty()){if(h[i]) {s.push(i);}}else if(h[s.top()]<=h[i]){s.push(i);}else{while(!s.empty() && h[s.top()]>h[i]){t=s.top();s.pop();cnt[t]=i-t;}if(h[i]) s.push(i);}}while(!s.empty()) s.pop();for(i=n-2;i>=0;--i){if(s.empty()){if(h[i]) {s.push(i);}}else if(h[s.top()]<=h[i]){s.push(i);}else{while(!s.empty() && h[s.top()]>h[i]){t=s.top();s.pop();if(t-i+cnt[t]>=k) ans=max(ans,h[t]);}if(h[i]) s.push(i);}}while(!s.empty() && h[s.top()]>0){t=s.top();s.pop();if(t-i+cnt[t]>=k) ans=max(ans,h[t]);}printf("%d\n",ans);//栈得到宽度return 0;}

    poj3167

    变形KMP,当前面小于且小于等于的数个数(树状数组维护)都相等,相当于s[i]==s[j]。

    #include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cmath>using namespace std;#define maxk 25100#define maxn 100100#define maxs 30#define lowbit(x) (x&(-x))int a[maxn],b[maxk],c[maxs],e[maxk],l[maxk],ans[maxn],next[maxk];int n,k,s,tot;void add(int x,int d){    if(!x) return;    while(x<=s){        c[x]+=d;        x+=lowbit(x);    }}int sum(int x){    int ans=0;    while(x>0){        ans+=c[x];        x-=lowbit(x);    }    return ans;}void gaonext(){    int i,j,p;    next[0]=-1;    for(i=0,j=-1;i<k;){        if(j==-1 || (l[j]==sum(b[i]-1) && e[j]==sum(b[i]))){            ++i,++j;            add(b[i],1);            next[i]=j;        }else{            for(p=i-j;p<i-next[j];++p) add(b[p],-1);            j=next[j];        }    }}void kmp(){    int i,j,p;    add(a[0],1);    for(i=0,j=0;i<n;){        if(l[j]==sum(a[i]-1) && e[j]==sum(a[i])){            ++i,++j;            add(a[i],1);            if(j==k){                ans[tot++]=i-k;                for(p=i-j;p<i-next[j];++p) add(a[p],-1);                j=next[j];            }        }else{            for(p=i-j;p<i-next[j];++p) add(a[p],-1);            j=next[j];        }    }}int main(){    int i;    scanf("%d%d%d",&n,&k,&s);    for(i=0;i<n;++i) scanf("%d",&a[i]);    for(i=0;i<k;++i){        scanf("%d",&b[i]);        add(b[i],1);        e[i]=sum(b[i]);        l[i]=sum(b[i]-1);     //   printf("i=%d ei=%d li=%d\n",i,e[i],l[i]);    }    memset(c,0,sizeof(c));    gaonext();  //  for(i=0;i<=k;++i) printf("i=%d nei=%d\n",i,next[i]);    memset(c,0,sizeof(c));    kmp();    printf("%d\n",tot);    for(i=0;i<tot;++i) printf("%d\n",ans[i]+1);    return 0;}


原创粉丝点击