yicongli

HIHO1449

Mar 6th, 2019
463
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.52 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define ll long long
  6.  
  7. const int N=2000005;
  8.  
  9. int tot;
  10. int Max[N];
  11. int Min[N];
  12. int Trans[N][26];
  13. int fa[N];
  14. int siz[N];
  15.  
  16. inline int NewNode(int mx,int mi,int *trans,int suffix,bool f){
  17.     Max[tot]=mx;
  18.     Min[tot]=mi;
  19.     if(trans==NULL)memset(Trans[tot],-1,sizeof(Trans[tot]));
  20.     else memcpy(Trans[tot],trans,sizeof(Trans[tot]));
  21.     fa[tot]=suffix;
  22.     siz[tot]=f;
  23.     return tot++;
  24. }
  25.  
  26. inline int insert(int u,int c){
  27.     int z=NewNode(Max[u]+1,0,NULL,-1,1);
  28.     int v=u;
  29.     while(v!=-1&&Trans[v][c]==-1){
  30.         Trans[v][c]=z;
  31.         v=fa[v];
  32.     }
  33.     if(v==-1){
  34.         Min[z]=1;
  35.         fa[z]=0;
  36.         return z;
  37.     }
  38.     int x=Trans[v][c];
  39.     if(Max[x]==Max[v]+1){
  40.         Min[z]=Max[x]+1;
  41.         fa[z]=x;
  42.         return z;
  43.     }
  44.     int y=NewNode(Max[v]+1,0,Trans[x],fa[x],0);
  45.     Min[z]=Min[x]=Max[y]+1;
  46.     fa[z]=fa[x]=y;
  47.     Min[y]=Max[fa[y]]+1;
  48.     int w=v;
  49.     while(w!=-1&&Trans[w][c]==x){
  50.         Trans[w][c]=y;
  51.         w=fa[w];
  52.     }
  53.     return z;
  54. }
  55.  
  56. int ans[N];
  57. queue<int>Q;
  58. char s[N];
  59. int deg[N];
  60.  
  61. int main(){
  62.     scanf("%s",s);
  63.     int n=strlen(s);
  64.     int lst=NewNode(0,0,NULL,-1,0);
  65.     for(int i=0;i<n;++i){
  66.         lst=insert(lst,s[i]-'a');
  67.     }
  68.     for(int i=1;i<tot;++i){
  69.         ++deg[fa[i]];
  70.     }
  71.     for(int i=1;i<tot;++i){
  72.         if(!deg[i]){
  73.             Q.push(i);
  74.         }
  75.     }
  76.     while(!Q.empty()){
  77.         int x=Q.front();Q.pop();
  78.         siz[fa[x]]+=siz[x];
  79.         if(!--deg[fa[x]]){
  80.             Q.push(fa[x]);
  81.         }
  82.     }
  83.     for(int i=1;i<tot;++i){
  84.         ans[Max[i]]=max(ans[Max[i]],siz[i]);
  85.     }
  86.     for(int i=n;i;--i){
  87.         ans[i]=max(ans[i],ans[i+1]);
  88.     }
  89.     for(int i=1;i<=n;++i){
  90.         printf("%d\n",ans[i]);
  91.     }
  92. }
Advertisement
Add Comment
Please, Sign In to add comment