Palindrome
中文解释:回文
题目链接:
http://poj.org/problem?id=3974
题目大意:
求取字符串str中的最长回文的长度
算法:
Manacher
时间复杂度O(N),空间复杂度O(N),N=strlen(str)。
AC代码:
<span style="font-size:14px;">#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int N_MAX=2000040;
int rad[N_MAX];
char str[N_MAX];
int len;
int Solve()
{
//fill(rad,rad+N_MAX,0);
//scanf("%s",str);
len=strlen(str);
if(len==0)
return 0;
for(int i=2*len+1;i>1;i-=2){
str[i]='#';
str[i-1]=str[i/2-1];
}
str[0]='$';str[1]='#';str[2*len+2]='\0';
/*for(int i=0;i<strlen(str);i++)
printf("%c",str[i]);
printf("\n");*/
int id(0),mx(0),mxrd(0);
for(int i=1;i<=2*len+1;i++){
rad[i]=mx>i?min(rad[2*id-i],mx-i):1;
while(str[i+rad[i]]==str[i-rad[i]])rad[i]++;
if(rad[i]+i>mx){
id=i;
mx=i+rad[i];
}
if(mxrd<rad[i])
mxrd=rad[i];
//printf("%d",rad[i]);
}
return mxrd-1;
}
int main()
{
int i=1;
while(scanf("%s",str)&&str[0]!='E'){
printf("Case %d: %d\n",i,Solve());
//puts(str);
i++;
}
return 0;
}</span>