#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int MAXN=2*1e6+10;
int sa[MAXN],rak[MAXN],tp[MAXN],tax[MAXN],a[MAXN],N,M,height[MAXN];
char s[MAXN];
void Qsort()
{
for(int i=1;i<=M;i++) tax[i]=0;
for(int i=1;i<=N;i++) tax[rak[i]]++;
for(int i=1;i<=M;i++) tax[i]+=tax[i-1];
for(int i=N;i>=1;i--) sa[ tax[rak[tp[i]]]-- ] = tp[i];
}
void Ssort()
{
M=127;
for(int i=1;i<=N;i++) rak[i]=a[i],tp[i]=i;Qsort();
for(int w=1,p=1; p<N ; w<<=1,M=p)
{
p=0;
for(int i=N-w+1;i<=N;i++) tp[++p]=i;
for(int i=1;i<=N;i++) if(sa[i]>w) tp[++p]=sa[i]-w;
Qsort();
swap(tp,rak);
rak[sa[1]]=1;p=1;
for(int i=2;i<=N;i++) rak[sa[i]] = (tp[sa[i]]==tp[sa[i-1]]&&tp[sa[i]+w]==tp[sa[i-1]+w])?p:++p;
}
int j,k=0;
for(int i=1;i<=N;height[rak[i++]]=k)
for(k=k?k-1:k,j=sa[rak[i]-1];a[i+k]==a[j+k];++k );
for(int i=0;i<=N;i++)
{
for(int j=height[i]+1;;j++)
{
int tot=1;
for(int k=i+1;height[k]>=j;++k,++tot);
if(tot>1) printf("%d\n",tot);
else break;
}
}
}
int main()
{
#ifdef WIN32
freopen("a.in","r",stdin);
#else
#endif
int Meiyong;
cin>>Meiyong;
scanf("%s",s);
N=strlen(s);
for(int i=1;i<=N;i++) a[i]=s[i-1];
Ssort();
return 0;
}
网友评论