后缀数组模板
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了后缀数组模板相关的知识,希望对你有一定的参考价值。
1 const int maxn=50010; 2 int r[maxn],Wa[maxn],Wb[maxn],Wv[maxn],Ws[maxn],rank[maxn],lcp[maxn],sa[maxn]; 3 4 bool cmp(int *p,int i,int j,int l) 5 {return p[i]==p[j]&&p[i+l]==p[j+l];} 6 7 void DA(int n,int m) 8 { 9 int i,j,p,*x=Wa,*y=Wb; 10 for(i=0;i<m;i++)Ws[i]=0; 11 for(i=0;i<n;i++)++Ws[x[i]=r[i]]; 12 for(i=1;i<m;i++)Ws[i]+=Ws[i-1]; 13 for(i=n-1;i>=0;i--)sa[--Ws[x[i]]]=i; 14 15 for(j=1,p=1;p<n;m=p,j<<=1) 16 { 17 for(p=0,i=n-j;i<n;i++)y[p++]=i; 18 for(i=0;i<n;i++) 19 if(sa[i]>=j) 20 y[p++]=sa[i]-j; 21 for(i=0;i<m;i++)Ws[i]=0; 22 for(i=0;i<n;i++)Wv[i]=x[y[i]]; 23 for(i=0;i<n;i++)++Ws[Wv[i]]; 24 for(i=1;i<m;i++)Ws[i]+=Ws[i-1]; 25 for(i=n-1;i>=0;i--)sa[--Ws[Wv[i]]]=y[i]; 26 for(swap(x,y),x[sa[0]]=0,i=1,p=1;i<n;i++) 27 x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++; 28 } 29 } 30 31 void LCP(int n) 32 { 33 int i,j,k=0; 34 for(i=1;i<=n;i++)rank[sa[i]]=i; 35 for(i=0;i<n;lcp[rank[i++]]=k) 36 for(k=k?k-1:k,j=sa[rank[i]-1];r[i+k]==r[j+k];k++); 37 }
以上是关于后缀数组模板的主要内容,如果未能解决你的问题,请参考以下文章