题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068
题意:求一个字符串中最长的回文串的长度
想法:manacher 推荐一个地址,推荐一个地址http://blog.csdn.net/ggggiqnypgjg/article/details/6645824
AC代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=111000;
char str[maxn],str1[2*maxn];
int nxt[2*maxn];
int next[maxn];
void manacher(){
memset(nxt,0,sizeof(nxt));
int mx=0,mid=0;
int len=strlen(str1);
for(int i=1;i<len;i++){
if(mx>i) nxt[i]=min(nxt[2*mid-i],mx-i);
else nxt[i]=1;
while(str1[i-nxt[i]]==str1[i+nxt[i]]) nxt[i]++;
if(i+nxt[i]>mx){
mx=i+nxt[i];
mid=i;
}
}
}
void pre(){
int i=1,j=0,k=0;
str1[0]='#';
while(str[j]!='\0'){
str1[i++]=k?str[j++]:'#';
k^=1;
}
str1[i++]='#';
str1[i]='\0';
}
int main(){
while(~scanf("%s",str)){
pre();
int ans=0;
manacher();
int n=strlen(str1);
for(int i=0;i<n;i++)
ans=max(ans,nxt[i]-1);
cout<< ans <<endl;
}
return 0;
}