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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
| #include<bits/stdc++.h> #define Inf 0x3f3f3f3f using namespace std; typedef long long LL; typedef pair<char,int> P; const int MAXX=100005;
int n; char a[MAXX],s[MAXX];
typedef unsigned long long ull;
ull p[MAXX],hasha[MAXX],hashs[MAXX],prim=233;
inline void init(){ p[0]=1ull; for(int i=1;i<MAXX;++i) p[i]=p[i-1]*prim; } inline ull gethasha(int l,int r){ return hasha[r]-hasha[l-1]*p[r-l+1]; } inline ull gethashs(int l,int r){ return hashs[l]-hashs[r+1]*p[r-l+1]; }
P suf[MAXX];
inline bool xiao(int st,int en,int enn){ int l=0,r=enn-st+1,mid; while(l<r){ mid=(l+r)/2; if(mid==l){ ++mid; ull jj,kk; if(mid>en-st+1){ jj=gethashs(st,en)*p[mid-(en-st+1)]+gethasha(en+1,en+mid-(en-st+1)); } else jj=gethashs(en-mid+1,en); kk=gethashs(enn-mid+1,enn); if(jj==kk) l=mid; break; } else{ ull jj,kk; if(mid>en-st+1){ jj=gethashs(st,en)*p[mid-(en-st+1)]+gethasha(en+1,en+mid-(en-st+1)); } else jj=gethashs(en-mid+1,en); kk=gethashs(enn-mid+1,enn); if(jj==kk) l=mid; else r=mid-1; } }
if(l>=en-st+1) return a[st+l]<a[enn-l]; return a[en-l]<a[enn-l]; }
inline void solve(){ getchar();scanf("%s",a+1); n=strlen(a+1); a[n+1]='z'; hashs[n+1]=0; for(int i=1;i<=n;++i) hasha[i]=hasha[i-1]*prim+a[i]; for(int i=n;i>=1;--i) hashs[i]=hashs[i+1]*prim+a[i]; suf[n]=P(a[n],n); for(int i=n-1;i>=1;--i){ if(a[i]<suf[i+1].first) suf[i]=P(a[i],i); else suf[i]=suf[i+1]; } int st=0,en=0; for(int i=1;i<=n;++i){ if(a[i]>suf[i].first){ st=i,en=suf[i].second; break; } } if(st==0){ for(int i=1;i<=n;++i) printf("%c",a[i]); printf("\n"); return; } for(int i=en-1;i>st;--i) if(xiao(st,i,en)) en=i;
for(int i=1;i<st;++i) printf("%c",a[i]); for(int i=en;i>=st;--i) printf("%c",a[i]); for(int i=en+1;i<=n;++i) printf("%c",a[i]); printf("\n"); }
signed main(){ init(); int t;scanf("%d",&t); while(t--) solve(); return 0; }
|