poj 3974 Palindrome

来源:互联网 发布:淘宝货款 编辑:程序博客网 时间:2024/04/26 02:03

题目链接:http://poj.org/problem?id=3974

题目思路:求最长回文子串。这个题目数据太水了,网上我找到了两个错误方法,个人觉得这个题不适合用后缀数组,后缀数组里面要用到RMQ,而这样会超内存。网上看到了一种O(n)的算法,叫做Manacher,比较好理解,而且编程也简单,就学习了一下。

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<string>#include<queue>#include<algorithm>#include<vector>#include<stack>#include<list>#include<iostream>#include<map>using namespace std;#define inf 0x3f3f3f3f#define M 1100000int max(int a,int b){return a>b?a:b;}int min(int a,int b){return a<b?a:b;}char s[2*M],str[M];int p[2*M];int main(){    int i,j,k,n,mx,id,count=1;    while(scanf("%s",str)!=EOF)    {        if(str[0]=='E') break;        n=strlen(str);        s[0]='$';        for(i=0;str[i];i++)        {            s[2*i+1]='#';            s[2*i+2]=str[i];        }        s[2*n+1]='#';        s[2*n+2]=0;        mx=0;        id=0;        for(i=1;i<=2*n+1;i++)        {            if(i<=mx) p[i]=min(p[2*id-i],mx-i+1);            else p[i]=1;            for(;s[i+p[i]]==s[i-p[i]];p[i]++)            ;            if(i+p[i]-1>mx)            {                mx=i+p[i]-1;                id=i;            }        }        int ans=0;        for(i=1;i<=2*n+1;i++)        {            ans=max(ans,p[i]-1);        }        printf("Case %d: %d\n",count++,ans);    }}


 

原创粉丝点击