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 }