1 #include<iostream>
2 #include<cstdio>
3 #include<cstdlib>
4 #include<cstring>
5 #include<cmath>
6 #include<algorithm>
7 using namespace std;
8 const int N=60050;
9
10 inline void read(int &s){
11 s=0;char ch=getchar();
12 for(;ch<‘0‘ || ch>‘9‘;ch=getchar());
13 for(;ch>=‘0‘ && ch<=‘9‘;ch=getchar())s=s*10+ch-‘0‘;
14 }
15 int s[N],nn,n;
16 char ch;
17 int sa[N],Rank[N],wu[N],wv[N],wa[N],wb[N];
18 inline void SA(int *r,int *sa,int n,int m){
19 int *x=wa,*y=wb;
20 for(int i=0;i<m;++i)wu[i]=0;
21 for(int i=0;i<n;++i)++wu[x[i]=r[i]];
22 for(int i=1;i<m;++i)wu[i]+=wu[i-1];
23 for(int i=n-1;~i;--i)sa[--wu[x[i]]]=i;
24 for(int j=1,p=0;p<n;j<<=1,m=p){
25 p=0;
26 for(int i=n-j;i<n;++i)y[p++]=i;
27 for(int i=0;i<n;++i)if(sa[i]>=j)y[p++]=sa[i]-j;
28
29 for(int i=0;i<m;++i)wu[i]=0;
30 for(int i=0;i<n;++i)++wu[wv[i]=x[y[i]]];
31 for(int i=1;i<m;++i)wu[i]+=wu[i-1];
32 for(int i=n-1;~i;--i)sa[--wu[wv[i]]]=y[i];
33
34 swap(x,y);
35 p=1;
36 x[sa[0]]=0;
37 for(int i=1;i<n;++i)x[sa[i]]=((y[sa[i]]==y[sa[i-1]]) && y[sa[i]+j]==y[sa[i-1]+j]) ? p-1 : p++;
38 }
39 }
40 int main(){
41 read(n);
42 for(int i=0;i<n;++i){
43 for(ch=getchar();ch>‘Z‘ || ch<‘A‘;ch=getchar());
44 s[i]=ch-‘A‘+1;
45 }
46 s[n]=0;
47 nn=n<<1|1;
48 s[nn]=0;
49 for(int i=1;i<=n;++i)s[n+i]=s[n-i];
50 SA(s,sa,nn+1,28);
51 for(int i=1;i<=nn;++i)Rank[sa[i]]=i;
52 for(int a=0,b=n+1;a+b-n-1<n;){
53 if(Rank[a]<Rank[b])putchar(s[a++]+‘A‘-1);
54 else putchar(s[b++]+‘A‘-1);
55 if(!((a+b-n-1)%80))putchar(‘\n‘);
56 }
57 return 0;
58 }