码迷,mamicode.com
首页 > 其他好文 > 详细

[SPOJ8222]NSUBSTR - Substrings 后缀自动机

时间:2017-08-30 13:03:49      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:char   ext   自动机   max   class   后缀自动机   har   std   后缀   

 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 后缀自动机

标签:char   ext   自动机   max   class   后缀自动机   har   std   后缀   

原文地址:http://www.cnblogs.com/halfrot/p/7452428.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!