Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define ll long long
- const int N=2000005;
- int tot;
- int maxlen[N];
- int minlen[N];
- int trans[N][26];
- int slink[N];
- inline int NewNode(int _maxlen,int _minlen,int *_trans,int _slink){
- maxlen[tot]=_maxlen;
- minlen[tot]=_minlen;
- for(int i=0;i<26;++i){
- if(_trans==NULL){
- trans[tot][i]=-1;
- }
- else {
- trans[tot][i]=_trans[i];
- }
- }
- slink[tot]=_slink;
- return tot++;
- }
- inline int insert(int u,char ch){
- int c=ch-'a';
- int z=NewNode(maxlen[u]+1,0,NULL,-1);
- int v=u;
- while(v!=-1&&trans[v][c]==-1){
- trans[v][c]=z;
- v=slink[v];
- }
- if(v==-1){
- minlen[z]=1;
- slink[z]=0;
- return z;
- }
- int x=trans[v][c];
- if(maxlen[v]+1==maxlen[x]){
- minlen[z]=maxlen[x]+1;
- slink[z]=x;
- return z;
- }
- int y=NewNode(maxlen[v]+1,-1,trans[x],slink[x]);
- minlen[z]=minlen[x]=maxlen[y]+1;
- slink[z]=slink[x]=y;
- int w=v;
- while(w!=-1&&trans[w][c]==x){
- trans[w][c]=y;
- w=slink[w];
- }
- minlen[y]=maxlen[slink[y]]+1;
- return z;
- }
- char s[N];
- int main(){
- scanf("%s",s);
- int n=strlen(s);
- int lst=NewNode(0,0,NULL,-1);
- for(int i=0;i<n;++i){
- lst=insert(lst,s[i]);
- }
- ll ans=0;
- for(int i=1;i<tot;++i){
- ans+=maxlen[i]-minlen[i]+1;
- }
- printf("%lld\n",ans);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement