记录编号 371774 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [USACO Dec07]最佳老农(金组) 最终得分 100
用户昵称 GravatarGo灬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;
	}
}