最长回文

#include <iostream>
using namespace std;
#include <string>

int Min(int a,int b)
{
    int c=a<b?a:b;
    return c;
}
int p[220020];
int main()
{
    char str[220020],str1[110010];
    while (cin>>str1)
    {
        int len=strlen(str1);
        if (len==0)
            continue;
        str[0]='$';
        str[1] = '#';
        int i , j = 2;
        for (i=0;i<len;i++)
        {
            str[j++] = str1[i];
            str[j++] = '#';
        }
        str[j]='\0';
        int id;
        int mx=0;
        int n = j ;
        
        memset(p,0,sizeof(p));
        for (i=1;i<n;i++)
        {
            if (mx>i)
            {
                p[i]=Min(p[2*id-i],mx-i);     //优化的关键
            }
            else
            {
                p[i]=1;
            }
            while (str[i+p[i]]==str[i-p[i]])
                p[i]++;
            if (mx<p[i]+i)
            {
                mx=p[i]+i;
                id=i;
            }
        }
        int max=p[1];
        for (i=1;i<n;i++)
        {
            if (max<p[i])
                max=p[i];
        }
        cout<<max-1<<endl;
    }
    return 0;
}

最长回文

Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 40   Accepted Submission(s) : 13

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

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

Source

posted on 2013-08-30 20:14  不知妖精  阅读(190)  评论(0编辑  收藏  举报

导航