您的位置:首页 > 其它

POJ 3974 Palindrome

2014-12-30 16:38 381 查看
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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  POJ 最长回文 Manacher