#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn=3010;
int ra[maxn],rb[maxn],st[maxn],sa[maxn],v[maxn],rank[maxn],h[maxn];
char str[maxn];
int n,m;
void work()
{
int i,j,k,p,*x=ra,*y=rb;
for(i=0;i<n;i++) st[x[i]=v[i]]++;
for(i=1;i<m;i++) st[i]+=st[i-1];
for(i=n-1;i>=0;i--) sa[--st[x[i]]]=i;
for(j=1,p=1;p<n;j<<=1,m=p)
{
for(p=0,i=n-j;i<n;i++) y[p++]=i;
for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;
for(i=0;i<m;i++) st[i]=0;
for(i=0;i<n;i++) st[x[y[i]]]++;
for(i=1;i<m;i++) st[i]+=st[i-1];
for(i=n-1;i>=0;i--) sa[--st[x[y[i]]]]=y[i];
for(swap(x,y),p=1,x[sa[0]]=0,i=1;i<n;i++)
x[sa[i]]=(y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+j]==y[sa[i]+j])?p-1:p++;
}
for(i=0;i<n;i++) rank[sa[i]]=i;
for(i=k=0;i<n-1;h[rank[i++]]=k)
for(k?k--:0,j=sa[rank[i]-1];v[i+k]==v[j+k];k++);
}
int main()
{
scanf("%d%s",&n,str);
int i,j,r;
for(i=0;i<n;i++) v[i]=str[i]-‘0‘+1;
m=3;
n++;
work();
for(i=1;i<n;i++)
{
for(j=h[i]+1;sa[i]+j<n;j++)
{
//网上的题解这里还向下求了一下区间的左端点l,感觉不明觉厉
for(r=i+1;r<=n&&h[r]>=j;r++);
if(r-i>=2) printf("%d\n",r-i);
}
}
return 0;
}