Advertisement
yicongli

HIHO1445

Mar 6th, 2019
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.25 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.  
  11. int maxlen[N];
  12. int minlen[N];
  13. int trans[N][26];
  14. int slink[N];
  15.  
  16. inline int NewNode(int _maxlen,int _minlen,int *_trans,int _slink){
  17.     maxlen[tot]=_maxlen;
  18.     minlen[tot]=_minlen;
  19.     for(int i=0;i<26;++i){
  20.         if(_trans==NULL){
  21.             trans[tot][i]=-1;
  22.         }
  23.         else {
  24.             trans[tot][i]=_trans[i];
  25.         }
  26.     }
  27.     slink[tot]=_slink;
  28.     return tot++;
  29. }
  30.  
  31. inline int insert(int u,char ch){
  32.     int c=ch-'a';
  33.     int z=NewNode(maxlen[u]+1,0,NULL,-1);
  34.     int v=u;
  35.     while(v!=-1&&trans[v][c]==-1){
  36.         trans[v][c]=z;
  37.         v=slink[v];
  38.     }
  39.     if(v==-1){
  40.         minlen[z]=1;
  41.         slink[z]=0;
  42.         return z;
  43.     }
  44.     int x=trans[v][c];
  45.     if(maxlen[v]+1==maxlen[x]){
  46.         minlen[z]=maxlen[x]+1;
  47.         slink[z]=x;
  48.         return z;
  49.     }
  50.     int y=NewNode(maxlen[v]+1,-1,trans[x],slink[x]);
  51.     minlen[z]=minlen[x]=maxlen[y]+1;
  52.     slink[z]=slink[x]=y;
  53.     int w=v;
  54.     while(w!=-1&&trans[w][c]==x){
  55.         trans[w][c]=y;
  56.         w=slink[w];
  57.     }
  58.     minlen[y]=maxlen[slink[y]]+1;
  59.     return z;
  60. }
  61.  
  62. char s[N];
  63.  
  64. int main(){
  65.     scanf("%s",s);
  66.     int n=strlen(s);
  67.     int lst=NewNode(0,0,NULL,-1);
  68.     for(int i=0;i<n;++i){
  69.         lst=insert(lst,s[i]);
  70.     }
  71.     ll ans=0;
  72.     for(int i=1;i<tot;++i){
  73.         ans+=maxlen[i]-minlen[i]+1;
  74.     }
  75.     printf("%lld\n",ans);
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement