详细了解请看以下链接:
https://blog.csdn.net/ggggiqnypgjg/article/details/6645824
https://blog.csdn.net/xingyeyongheng/article/details/9310555
Problem Description
给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等
Input
输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000
Output
每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
Sample Input
aaaa abab
Sample Output
4 3
AC代码:
#include<bits/stdc++.h>
using namespace std;const int maxn=2e5+10;
char a[maxn],b[maxn];
int p[maxn];int main(){
while(~scanf("%s",b+1)){
int n,m,cnt=1,mxx=1,id=1,ans=0;
m=strlen(b+1);
for(int i=1;i<=m;i++){
a[cnt]='#';
cnt++;
a[cnt]=b[i];
cnt++;
}
for(int i=1;i<=cnt;i++){
if(mxx<=i) p[i]=1;
else p[i]=min(p[id*2-i],mxx-i);
while(a[i+p[i]]==a[i-p[i]])
p[i]++;
if(i+p[i]>mxx){
mxx=i+p[i];
id=i;
}
if(p[i]>ans){
if(i&1) ans=p[i]/2*2;
else ans=(p[i]-1)/2*2+1;
}
}
printf("%d\n",ans);
}
return 0;
}