后缀数组模板
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 }
尽最大的努力,做最好的自己!
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步