[SPOJ8222]NSUBSTR - Substrings 后缀自动机
Posted halfrot
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[SPOJ8222]NSUBSTR - Substrings 后缀自动机相关的知识,希望对你有一定的参考价值。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int sz=0,la,rt; 6 int ch[500010][26],l[500010],fa[500010]; 7 void Extend(int c){ 8 int end=++sz,tmp=la; 9 l[end]=l[tmp]+1; 10 while(tmp&&!ch[tmp][c]){ 11 ch[tmp][c]=end; 12 tmp=fa[tmp]; 13 } 14 if(!tmp) fa[end]=rt; 15 else{ 16 int ne=ch[tmp][c]; 17 if(l[ne]==l[tmp]+1) fa[end]=ne; 18 else{ 19 int np=++sz; 20 memcpy(ch[np],ch[ne],sizeof(ch[ne])); 21 fa[np]=fa[ne]; 22 l[np]=l[tmp]+1; 23 fa[ne]=fa[end]=np; 24 while(tmp&&ch[tmp][c]==ne){ 25 ch[tmp][c]=np; 26 tmp=fa[tmp]; 27 } 28 } 29 } 30 la=end; 31 } 32 char s[250010]; 33 int r[500010],c[500010],a[500010],f[500010]; 34 int main(){ 35 rt=la=++sz; 36 scanf("%s",s+1); 37 int len=strlen(s+1); 38 for(int i=1;i<=len;i++){ 39 r[sz+1]=1; 40 Extend(s[i]-‘a‘); 41 } 42 for(int i=1;i<=sz;i++) c[l[i]]++; 43 for(int i=1;i<=len;i++) c[i]+=c[i-1]; 44 for(int i=1;i<=sz;i++) a[c[l[i]]--]=i; 45 for(int i=sz;i>=1;i--) r[fa[a[i]]]+=r[a[i]]; 46 for(int i=1;i<=sz;i++) f[l[i]]=max(f[l[i]],r[i]); 47 for(int i=len;i>=1;i--) f[i]=max(f[i],f[i+1]); 48 for(int i=1;i<=len;i++) printf("%d\n",f[i]); 49 return 0; 50 }
以上是关于[SPOJ8222]NSUBSTR - Substrings 后缀自动机的主要内容,如果未能解决你的问题,请参考以下文章
●SPOJ 8222 NSUBSTR - Substrings
[SPOJ8222]NSUBSTR - Substrings 后缀自动机