记录编号 |
371774 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[USACO Dec07]最佳老农(金组) |
最终得分 |
100 |
用户昵称 |
Go灬Fire |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.163 s |
提交时间 |
2017-02-16 20:37:02 |
内存使用 |
1.70 MiB |
显示代码纯文本
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
#define Inf 2e9
const int maxn=60500;
int Ws[maxn],Wa[maxn],Wb[maxn];
int cmp(int *r,int x,int y,int l)
{return r[x]==r[y] && r[x+l]==r[y+l];}
void da(int *r,int *sa,int n,int m){
int i,j,p,*x=Wa,*y=Wb;
for(i=0;i<m;i++) Ws[i]=0;
for(i=0;i<n;i++) Ws[x[i]=r[i]]++;
for(i=1;i<m;i++) Ws[i]+=Ws[i-1];
for(i=n-1;i>=0;i--) sa[--Ws[x[i]]]=i;
for(j=1,p=1;p<n;j<<=1,m=p){
for(p=0,i=n-j;i<n;i++) y[p++]=i;
for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;
for(i=0;i<m;i++) Ws[i]=0;
for(i=0;i<n;i++) Ws[x[y[i]]]++;
for(i=1;i<m;i++) Ws[i]+=Ws[i-1];
for(i=n-1;i>=0;i--) sa[--Ws[x[y[i]]]]=y[i];
swap(x,y);x[sa[0]]=0;p=1;
for(i=1;i<n;i++)
x[sa[i]]=cmp(y,sa[i],sa[i-1],j) ? p-1 : p++;
}
}
int Rank[maxn];
int sa[maxn],n,a[maxn];
void Init();
int main(){
freopen("bclgold.in","r",stdin);freopen("bclgold.out","w",stdout);
Init();
return 0;
}
void Init(){
scanf("%d",&n);
for(int i=0;i<n;i++){
char ch;scanf(" %c",&ch);
a[i]=a[(n<<1)-i]=ch;
}
int len=n;
a[n]='$'+1;
n=(n<<1)+1;
a[n]='$';
da(a,sa,n+1,'Z'+50);
for(int i=1;i<=n;i++)Rank[sa[i]]=i;
int i=0,j=len+1,num=0;
while(true){
if(Rank[i]<Rank[j])printf("%c",a[i]),i++;
else printf("%c",a[j]),j++;
num++;
if(num==len)break;
}
}