原题:http://bunny.myunas.com/oj/problem.php?id=1002
题解:找出最长回文串,manacher模板题。。。这题的读入有些复杂。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define reg register
using namespace std;
const int N=22000;
char s[N],t[N<<1],a[N<<1];
int n,p[N],pos[N<<1],len,mx,id,ans,pi;
int main(){
// freopen("manacher.in","r",stdin);
int hd=0;char ch=getchar();
while(ch!=EOF) s[++hd]=ch,ch=getchar();
len=0;
for(reg int i=1;i<=strlen(s+1);i++){
if(s[i]>='a' && s[i]<='z') a[++len]=s[i],pos[len]=i;
if(s[i]>='A' && s[i]<='Z') a[++len]=s[i]-'A'+'a',pos[len]=i;
}
t[0]='$';
for(reg int i=1;i<=len;i++) t[i<<1]=a[i],t[(i<<1)-1]='#';
t[(len<<1)+1]='#';
mx=id=0;n=(len<<1)+1;
for(reg int i=1;i<=n;i++){
if(mx>i) p[i]=min(2*id-i,mx-i);
else p[i]=1;
while(t[i+p[i]]==t[i-p[i]]) p[i]++;
if(mx<p[i]+i){id=i;mx=p[i]+i;}
if(p[i]-1>ans) ans=p[i]-1,pi=i;
}
printf("%d\n",ans);
int ls=pi-ans+1;ls>>=1;
int rs=pi+ans-1;rs>>=1;
for(reg int i=pos[ls];i<=pos[rs];i++) putchar(s[i]);
return 0;
}