回文串---最长回文

HDU   3068

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
 
字符串求最长回文串的模板题:
代码如下:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
const int N=120005;
int p[2*N];
char s[2*N],str[2*N];
int n;

void kp()
{
    int mx=0;
    int id;
    ///for(i=n;str[i]!=0;i++)
    ///str[i]=0; ///没有这一句有问题,就过不了ural1297,比如数据:ababa aba;
    for(int i=1;i<n;i++)
    {
        if(mx>i)
            p[i]=min(p[2*id-i],p[id]+id-i);
        else
            p[i]=1;
        for( ;str[i+p[i]]==str[i-p[i]];p[i]++);
        if(p[i]+i>mx)
        {
            mx=p[i]+i;
            id=i;
        }
    }
}

void init()
{
    str[0]='$';
    str[1]='#';
    for(int i=0;i<n;i++)
    {
        str[i*2+2]=s[i];
        str[i*2+3]='#';
    }
    n=n*2+2;
    s[n]=0;
}

int main()
{
    while(scanf("%s",&s)!=EOF)
    {
        n=strlen(s);
        init();
        kp();
        int tmp=0;
        for(int i=1;i<n;i++)
            if(p[i]>tmp) tmp=p[i];
        printf("%d
",tmp-1);
    }
    return 0;
}
 
原文地址:https://www.cnblogs.com/chen9510/p/5426636.html