1 #include<iostream>
2 #include<cstring>
3 #include<cstdio>
4 #include<cstdlib>
5 #include<cmath>
6 #include<algorithm>
7 using namespace std;
8 int sa[202020],rank[202020],rank1[202020],a[202020];
9 int c[202020];
10 int m=0;
11 char ch[202020];
12 int n=0;
13 void build_sa()
14 {
15 memset(c,0,sizeof(c));
16 int *x=rank,*y=rank1;
17 for(int i=0;i<n;i++) c[x[i]=ch[i]]++;
18 for(int i=1;i<m;i++) c[i]+=c[i-1];
19 for(int i=n-1;i>=0;i--) sa[--c[x[i]]]=i;
20 for(int i=1;i<=n;i<<=1)
21 {
22 int p=0;
23 for(int j=n-i;j<n;j++) y[p++]=j;
24 for(int j=0;j<n;j++) if(sa[j]-i>=0) y[p++]=sa[j]-i;
25 memset(c,0,sizeof(c));
26 for(int j=0;j<n;j++) c[x[y[j]]]++;
27 for(int j=1;j<m;j++) c[j]+=c[j-1];
28 for(int j=n-1;j>=0;j--) sa[--c[x[y[j]]]]=y[j];
29 swap(x,y);
30 p=1;x[sa[0]]=0;
31 for(int j=1;j<n;j++) x[sa[j]]=y[sa[j-1]]==y[sa[j]]&&y[sa[j]+i]==y[sa[j-1]+i]? p-1:p++;
32 if(p>=n) break;
33 m=p;
34 }
35 }
36 int main()
37 {
38 int len=0;
39 scanf("%s",ch);
40 len=strlen(ch);
41 for(int i=0;i<len-1;i++) ch[i+len]=ch[i];
42 for(int i=0;i<len;i++) m=max(m,int(ch[i]));
43 n=len*2-1;
44 m++;
45 build_sa();
46 for(int i=0;i<n;i++)
47 if(sa[i]<len) printf("%c",ch[sa[i]+len-1]);
48 }