1 /*
2 后缀数组板子题,注意第29行写法
3 */
4 include<iostream>
5 #include<cstdio>
6 #include<cstring>
7 #define maxn 15010
8 using namespace std;
9 int m=26,n,sa[maxn],rank[maxn],c[maxn],s[maxn],x[maxn],y[maxn];
10 char ch[maxn];
11 int main(){
12 freopen("Cola.txt","r",stdin);
13 scanf("%d%s",&n,ch);
14 for(int i=0;i<n;i++)s[i]=ch[i]-'a';
15
16 for(int i=0;i<n;i++)c[x[i]=s[i]]++;
17 for(int i=1;i<m;i++)c[i]+=c[i-1];
18 for(int i=n-1;i!=-1;i--)sa[--c[x[i]]]=i;
19 int k=1,p=0;
20 while(k<=n){
21 for(int i=n-k;i<n;i++)y[p++]=i;
22 for(int i=0;i<n;i++)if(sa[i]>=k)y[p++]=sa[i]-k;
23 for(int i=0;i<m;i++)c[i]=0;
24 for(int i=0;i<n;i++)c[x[y[i]]]++;
25 for(int i=1;i<m;i++)c[i]+=c[i-1];
26 for(int i=n-1;i!=-1;i--)sa[--c[x[y[i]]]]=y[i];
27 swap(x,y);p=1;x[sa[0]]=0;
28 for(int i=1;i<n;i++)
29 if(y[sa[i-1]]==y[sa[i]]&&((y[sa[i-1]+k]==y[sa[i]+k]&&sa[i-1]+k<n&&sa[i]+k<n)||(sa[i-1]+k>=n&&sa[i]+k>=n))) x[sa[i]]=p-1;
30 else x[sa[i]]=p++;
31 if(p>=n)break;
32 m=p;p=0;k*=2;
33 }
34 for(int i=0;i<n;i++)printf("%d\n",sa[i]+1);
35 }