1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| #include<iostream> #include<cstdio> #include<cstring> #define ll long long using namespace std; namespace Ehnaev{ inline ll read() { ll ret=0,f=1;char ch=getchar(); while(ch<48||ch>57) {if(ch==45) f=-f;ch=getchar();} while(ch>=48&&ch<=57) {ret=(ret<<3)+(ret<<1)+ch-48;ch=getchar();} return ret*f; } inline void write(ll x) { static char buf[22];static ll len=-1; if(x>=0) {do{buf[++len]=x%10+48;x/=10;}while(x);} else {putchar(45);do{buf[++len]=-(x%10)+48;x/=10;}while(x);} while(len>=0) putchar(buf[len--]); } }using Ehnaev::read;using Ehnaev::write;
const ll N=1e6;
ll n,m,nn; ll sa[N+5],rk[N*2+5],oldrk[N*2+5],id[N+5],px[N+5],cnt[N+5]; char s[N+5];
inline bool Cmp(ll x,ll y,ll w) { return oldrk[x]==oldrk[y]&&oldrk[x+w]==oldrk[y+w]; }
int main() {
n=read(); for(ll i=1;i<=n;i++) {cin>>s[i];} for(ll i=1;i<=n;i++) {s[n+n+1-i+1]=s[i];} nn=n;n<<=1;n++;m=max(n,300ll);
for(ll i=1;i<=n;i++) ++cnt[rk[i]=s[i]]; for(ll i=1;i<=m;i++) cnt[i]+=cnt[i-1]; for(ll i=n;i>=1;i--) sa[cnt[rk[i]]--]=i;
for(ll w=1,p=0;;w<<=1,m=p) { p=0;for(ll i=n;i>n-w;i--) id[++p]=i; for(ll i=1;i<=n;i++) {if(sa[i]>w) id[++p]=sa[i]-w;} for(ll i=1;i<=m;i++) cnt[i]=0; for(ll i=1;i<=n;i++) ++cnt[px[i]=rk[id[i]]]; for(ll i=1;i<=m;i++) cnt[i]+=cnt[i-1]; for(ll i=n;i>=1;i--) sa[cnt[px[i]]--]=id[i]; for(ll i=1;i<=n;i++) oldrk[i]=rk[i]; p=0;for(ll i=1;i<=n;i++) {rk[sa[i]]=Cmp(sa[i],sa[i-1],w)?p:++p;} if(p==n) {for(ll i=1;i<=n;i++) sa[rk[i]]=i;break;} }
ll l=1,r=nn,cnt=0; while(l<=r) { ll tmpl=rk[l],tmpr=rk[n-r+1]; if(tmpl<tmpr) {putchar(s[l]);l++;} else {putchar(s[r]);r--;} cnt++; if(cnt%80==0) putchar(10); }
return 0; }
|