显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int SIZEN=60010;
void basesort(int a[],int b[],int c[],int n,int m){//排序前a,排序后b,关键字c,下标0~n-1,关键字0~m
static int sum[SIZEN]={0};
memset(sum,0,sizeof(sum));
for(int i=0;i<n;i++) sum[c[a[i]]]++;
for(int i=1;i<=m;i++) sum[i]+=sum[i-1];
for(int i=n-1;i>=0;i--) b[--sum[c[a[i]]]]=a[i];
}
void sort_suf(char S[],int rank[],int sa[],int N){//串S,名次数组rank,顺序数组sa,下标0~N-1
static int A[SIZEN],B[SIZEN];
static int x[SIZEN],y[SIZEN];
for(int i=0;i<N;i++) x[i]=S[i],A[i]=i;
basesort(A,sa,x,N,256);
rank[sa[0]]=1;
for(int i=1;i<N;i++){
if(x[sa[i]]==x[sa[i-1]]) rank[sa[i]]=rank[sa[i-1]];
else rank[sa[i]]=rank[sa[i-1]]+1;
}
for(int k=1;k<=N;k<<=1){
for(int i=0;i<N;i++){
x[i]=rank[i];
y[i]=i+k<N?rank[i+k]:0;
A[i]=i;
}
basesort(A,B,y,N,N);
basesort(B,sa,x,N,N);
rank[sa[0]]=1;
for(int i=1;i<N;i++){
if(x[sa[i]]==x[sa[i-1]]&&y[sa[i]]==y[sa[i-1]]) rank[sa[i]]=rank[sa[i-1]];
else rank[sa[i]]=rank[sa[i-1]]+1;
}
}
for(int i=0;i<N;i++) rank[sa[i]]=i;
}
int N;
char S[SIZEN];
int rank[SIZEN],sa[SIZEN];
char ans[SIZEN];
void work(void){
sort_suf(S,rank,sa,2*N+1);
int l=0,r=N-1;
int tot=0;
while(l<r){
if(rank[l]<=rank[2*N-r]){
ans[tot++]=S[l];
l++;
}
else{
ans[tot++]=S[r];
r--;
}
}
ans[tot++]=S[l];
int p=0;
for(int i=0;i<N;i++){
printf("%c",ans[i]);
p++;
if(p==80){
printf("\n");
p=0;
}
}
}
void read(void){
scanf("%d\n",&N);
for(int i=0;i<N;i++){
S[i]=getchar();
getchar();
}
S[N]='#';
for(int i=0;i<N;i++) S[N+1+i]=S[N-1-i];
}
int main(){
freopen("bclgold.in","r",stdin);
freopen("bclgold.out","w",stdout);
read();
work();
return 0;
}