#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define maxn 60010
char S[maxn];int SA[maxn],len;
int wa[maxn],wb[maxn],ws[maxn],wv[maxn];
int cmp(int *r,int a,int b,int l)
{
return r[a]==r[b]&&r[a+l]==r[b+l];
}
void DA(char *r,int *sa,int n,int m)
{
int p,*x=wa,*y=wb,*t;
for (int i=0; i<m; i++) ws[i]=0;
for (int i=0; i<n; i++) ws[x[i]=r[i]]++;
for (int i=1; i<m; i++) ws[i]+=ws[i-1];
for (int i=n-1; i>=0; i--) sa[--ws[x[i]]]=i;
p=1; for (int j=1; p<n; j*=2,m=p)
{
p=0; for (int i=n-j; i<n; i++) y[p++]=i;
for (int i=0; i<n; i++) if (sa[i]>=j) y[p++]=sa[i]-j;
for (int i=0; i<n; i++) wv[i]=x[y[i]];
for (int i=0; i<m; i++) ws[i]=0;
for (int i=0; i<n; i++) ws[wv[i]]++;
for (int i=1; i<m; i++) ws[i]+=ws[i-1];
for (int i=n-1; i>=0; i--) sa[--ws[wv[i]]]=y[i];
t=x,x=y,y=t;p=1;x[sa[0]]=0;
for (int i=1; i<n; i++)
x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
}
}
int rank[maxn],height[maxn];
void calheight(char *r,int *sa,int n)
{
int k=0;
for (int i=1; i<=n; i++) rank[sa[i]]=i;
for (int i=0; i<n; height[rank[i++]]=k)
{k?k--:0;for (int j=sa[rank[i]-1]; r[i+k]==r[j+k]; k++);}
}
int main()
{
int n;
scanf("%d\n",&n); char s[2];
for (int i=1; i<=n; i++)
scanf("%s",s),S[len++]=s[0];
S[len++]=‘@‘;
for (int i=n-1; i>=0; i--) S[len++]=S[i];
S[len]=0;
DA(S,SA,len+1,200); calheight(S,SA,len);
int L=0,R=n+1,cnt=0;
while (cnt<n)
{
cnt++;
if (rank[L]<rank[R]) putchar(S[L]),L++;
else putchar(S[R]),R++;
if (cnt%80==0) puts("");
}
return 0;
}
轻松1A系列..话说数据有点弱..一开始手误少了条语句竟然也1A了...