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 Max[N];
- int Min[N];
- int Trans[N][26];
- int fa[N];
- int siz[N];
- inline int NewNode(int mx,int mi,int *trans,int suffix,bool f){
- Max[tot]=mx;
- Min[tot]=mi;
- if(trans==NULL)memset(Trans[tot],-1,sizeof(Trans[tot]));
- else memcpy(Trans[tot],trans,sizeof(Trans[tot]));
- fa[tot]=suffix;
- siz[tot]=f;
- return tot++;
- }
- inline int insert(int u,int c){
- int z=NewNode(Max[u]+1,0,NULL,-1,1);
- int v=u;
- while(v!=-1&&Trans[v][c]==-1){
- Trans[v][c]=z;
- v=fa[v];
- }
- if(v==-1){
- Min[z]=1;
- fa[z]=0;
- return z;
- }
- int x=Trans[v][c];
- if(Max[x]==Max[v]+1){
- Min[z]=Max[x]+1;
- fa[z]=x;
- return z;
- }
- int y=NewNode(Max[v]+1,0,Trans[x],fa[x],0);
- Min[z]=Min[x]=Max[y]+1;
- fa[z]=fa[x]=y;
- Min[y]=Max[fa[y]]+1;
- int w=v;
- while(w!=-1&&Trans[w][c]==x){
- Trans[w][c]=y;
- w=fa[w];
- }
- return z;
- }
- int ans[N];
- queue<int>Q;
- char s[N];
- int deg[N];
- int main(){
- scanf("%s",s);
- int n=strlen(s);
- int lst=NewNode(0,0,NULL,-1,0);
- for(int i=0;i<n;++i){
- lst=insert(lst,s[i]-'a');
- }
- for(int i=1;i<tot;++i){
- ++deg[fa[i]];
- }
- for(int i=1;i<tot;++i){
- if(!deg[i]){
- Q.push(i);
- }
- }
- while(!Q.empty()){
- int x=Q.front();Q.pop();
- siz[fa[x]]+=siz[x];
- if(!--deg[fa[x]]){
- Q.push(fa[x]);
- }
- }
- for(int i=1;i<tot;++i){
- ans[Max[i]]=max(ans[Max[i]],siz[i]);
- }
- for(int i=n;i;--i){
- ans[i]=max(ans[i],ans[i+1]);
- }
- for(int i=1;i<=n;++i){
- printf("%d\n",ans[i]);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment