后缀数组模板

来源:互联网 发布:网络直播工作室招主播 编辑:程序博客网 时间:2024/06/06 21:47
void built(int *s,int *sa,int n,int m){int *x=t1,*y=t2;//要注意谁是引用,已经手残打错了几回了= =int i,j,k,p;for(i=0;i<m;i++)c[i]=0;for(i=0;i<n;i++)c[x[i]=s[i]]++;for(i=1;i<m;i++)c[i]+=c[i-1];for(i=n-1;i>=0;i--)sa[--c[x[i]]]=i;for(k=1;k<n;k<<=1){//倍增 for(i=n-k,p=0;i<n;i++)y[p++]=i;for(i=0;i<n;i++)if(sa[i]>=k)y[p++]=sa[i]-k;for(i=0;i<m;i++)c[i]=0;for(i=0;i<n;i++)c[x[y[i]]]++;for(i=1;i<m;i++)c[i]+=c[i-1];for(i=n-1;i>=0;i--)sa[--c[x[y[i]]]]=y[i];swap(x,y);p=1;x[sa[0]]=0;for(i=1;i<n;i++){if(y[sa[i]]==y[sa[i-1]]&&y[sa[i]+k]==y[sa[i-1]+k])x[sa[i]]=p-1;//注意数组else x[sa[i]]=p++;}if(p>=n)return ;m=p;}}void get_height(int *s,int n){int i,j,tot=0;for(i=1;i<=n;i++)rank[sa[i]]=i;for(i=0;i<n;i++){if(tot)tot--; else tot=0;j=sa[rank[i]-1];while(s[j+tot]==s[i+tot])tot++;height[rank[i]]=tot;}}

0 0