记录编号 |
457651 |
评测结果 |
AAAAAAAA |
题目名称 |
回文串 |
最终得分 |
100 |
用户昵称 |
REALIZE_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;
}