后缀数组模板
jys
posted @ Jul 21, 2013 08:11:42 PM
in 未分类
, 1047 阅读
#include <cstdio> #include <cstdlib> #include <cstring> #define NN 100001 int rank[NN],n,sum[NN]; int sa[NN],str[NN]; int trank[NN]={0},tsa[NN]={0}; void sort(int k) { memset(sum,0,sizeof(sum)); int i; for(i=1;i<=n;i++)sum[rank[i+k]]++; for(i=1;i<=n;i++)sum[i]+=sum[i-1]; for(i=1;i<=n;i++)trank[i]=sum[rank[i+k]]--; for(i=1;i<=n;i++)tsa[trank[i]]=i; memset(sum,0,sizeof(sum)); for(i=1;i<=n;i++)sum[rank[i]]++; for(i=1;i<=n;i++)sum[i]+=sum[i-1]; for(i=n;i>=1;i--)trank[tsa[i]]=sum[rank[tsa[i]]]--; for(i=1;i<=n;i++)sa[trank[i]]=i; trank[sa[1]]=1; for(i=2;i<=n;i++) if(rank[sa[i]]!=rank[sa[i-1]]||rank[sa[i]+k]!=rank[sa[i-1]+k]) trank[sa[i]]=trank[sa[i-1]]+1; else trank[sa[i]]=trank[sa[i-1]]; for(i=1;i<=n;i++)rank[i]=trank[i]; } int main() { scanf("%d",&n); int i,k;for(i=1;i<=n;i++)scanf("%d",&str[i]); for(i=1;i<=n;i++)sum[str[i]]++; for(i=1;i<=n;i++)sum[i]+=sum[i-1]; for(i=1;i<=n;i++)rank[i]=sum[str[i]-1]+1; for(k=1;2*k<=n;k<<=1)sort(k); for(i=1;i<=n;i++)sa[rank[i]]=i; }
2023年4月23日 00:34
crediblebh