最长回文

来源:互联网 发布:日本女孩做饭知乎 编辑:程序博客网 时间:2024/05/18 02:38

最长回文
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 11085 Accepted Submission(s): 3946

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
今天学习了一个关于O(n)的时间发杂度求最大回文串的;
思路很简单

#include <map>#include <list>#include <cmath>#include <queue>#include <stack>#include <string>#include <cstdio>#include <cstring>#include <cstdlib>#include <iostream>#include <algorithm>#define eps 1e-9#define PI acos(-1.0)#define INF 0x3f3f3f3f#define CRR fclose(stdin)#define CWW fclose(stdout)#define WW freopen("output.txt","w",stdout)#define RR freopen("input.txt","r",stdin)using namespace std;const int MAX=220010;char s[MAX];char str[MAX];int p[MAX];int len;void Change(){    len=1;    str[0]='$';    for(int i=0;s[i]!='\0';i++)    {        str[len++]='#';        str[len++]=s[i];    }    str[len++]='#';    str[len]='\0';}void Get_P(){    int id=0;    Change();    memset(p,0,sizeof(p));    for(int i=1;i<len;i++)    {        p[i]=id+p[id]>i?min(p[id]+id-i,p[2*id-i]):1;        while(str[i+p[i]]==str[i-p[i]])            p[i]++;        if(p[i]+i>p[id]+id)        {            id=i;        }    }}int main(){    while(~scanf("%s",s))    {        Get_P();        int ans=1;        for(int i=1;i<len;i++)        {            ans=max(ans,p[i]);        }        printf("%d\n",ans-1);    }}
0 0
原创粉丝点击