最长回文 分类: 串 2015-08-03 10:20 5人阅读 评论(0) 收藏

最长回文
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);
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted @ 2015-08-03 10:20  一骑绝尘去  阅读(138)  评论(0编辑  收藏  举报