记录编号 457651 评测结果 AAAAAAAA
题目名称 回文串 最终得分 100
用户昵称 GravatarREALIZE_BEYOND 是否通过 通过
代码语言 C++ 运行时间 0.008 s
提交时间 2017-10-09 08:04:32 内存使用 0.62 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std;
int pos[40005],p[40005],ans=-666;
int main(){
//	freopen("1.in","r",stdin);
	freopen("calfflac.in","r",stdin);
	freopen("calfflac.out","w",stdout);
	char c;
	string s,t="$";
	//读入参考了cstdio大佬的代码 
	while(scanf("%c",&c)!=EOF){
		s+=c;
		if(('a'<=c&&c<='z')||('A'<=c&&c<='Z')){
			if('A'<=c&&c<='Z')
			  c+=('a'-'A');
			t+='#';
			t+=c;
			pos[t.size()-1]=s.size()-1;//开始.size()竟然写成了sizeof(),调了一晚上。 
		}
	}
	t+='#';
	int temp=t.size();
	int mx=0,id=0;//此处id指的是延伸到最右时中间点,并不是最长长度时中间点 
	for(int i=1;i<temp;i++){
		p[i]=(mx>i?min(p[2*id-i],mx-i):1);
		while(t[i-p[i]]==t[i+p[i]]) p[i]++;
		if(i+p[i]>mx){
			mx=i+p[i];
			id=i;
		}
		ans=max(ans,p[i]);
	}
	cout<<ans-1<<"\n";
	id=0;//最长长度时中间点 ,方便输出字符串 
	temp=t.size(); 
	for(int i=1;i<t.size();i++) if(p[i]>p[id]) id=i;
	int l=id-p[id]+1,r=id+p[id]-1;
	if(t[l]=='#') l++;
	if(t[r]=='#') r--;
	for(int i=pos[l];i<=pos[r];i++) cout<<s[i];
	return 0;
}