BZOJ 1031后缀数组

来源:互联网 发布:linux 多线程结束 编辑:程序博客网 时间:2024/05/16 16:02

题意
题解:裸后缀数组,在此后缀数组写错表示很忧伤。
最后的那个m=p也是必要的!吔屎了。
模板

#include<ctime>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<iostream>#include<string>#include<cassert>#include<cmath>#include<vector>#include<queue>#include<stack>#include<map>#include<climits>#define X first#define Y second#define DB double#define MP make_pair#define LL long long#define pb push_back#define sqr(_) ((_)*(_))#define INF 0x3f3f3f3f#define pii pair<int,int>#define pdd pair<DB,DB>#define ull unsigned LL#define DEBUG(...) fprintf(stderr,__VA_ARGS__)using namespace std;const int MAXN=200012;char s[MAXN];int N,wx[MAXN],wy[MAXN],sa[MAXN],c[MAXN],wc[MAXN],wv[MAXN],wa[MAXN],wb[MAXN];bool cmp(int* r,int a,int b,int l){    return r[a]==r[b]&&r[a+l]==r[b+l];}void make_sa(int n,int m){    int *x=wx,*y=wy;    for(int i=0;i<n;i++)c[x[i]=s[i]]++;    for(int i=1;i<m;i++)c[i]+=c[i-1];    for(int i=n-1;i>=0;i--)sa[--c[x[i]]]=i;    for(int k=1;k<=n;k<<=1)    {        int p=0;        for(int i=n-k;i<n;i++)y[p++]=i;        for(int i=0;i<n;i++)if(sa[i]>=k)y[p++]=sa[i]-k;        memset(c,0,sizeof(c));        for(int i=0;i<n;i++)c[x[y[i]]]++;        for(int i=1;i<m;i++)c[i]+=c[i-1];        for(int i=n-1;i>=0;i--)sa[--c[x[y[i]]]]=y[i];        p=1;        swap(x,y);        x[sa[0]]=0;        for(int i=1;i<n;i++)            x[sa[i]]=cmp(y,sa[i-1],sa[i],k)?p-1:p++;        if(p>=n)            break;        m=p;    }}int main(){#ifndef ONLINE_JUDGE    freopen("cipher.in","r",stdin);    freopen("cipher.out","w",stdout);#endif    scanf("%s",s);    N=strlen(s);    for(int i=0;i<N;i++)        s[i+N]=s[i];    N*=2;    s[N++]=0;    DEBUG("%d\n",N);    make_sa(N,300);    //da(s,sa,N,300);    /*for(int i=0;i<N;i++)        printf("%d ",sa[i]);    puts("");*/    vector<char> ans;    int rank[MAXN]={};    for(int i=0;i<N;i++)        rank[sa[i]]=i;    for(int i=0;i<N;i++)    {        if(sa[i]<(N-1)/2)            ans.pb(s[sa[i]+(N-1)/2-1]);    }    //DEBUG("%d\n",ans.size());    for(int i=0;i<ans.size();i++)        printf("%c",ans[i]);    puts("");}
1 0
原创粉丝点击