Palindrome---poj3974(最大回文子串manacher)

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

和hdu上的最长回文题一样,manacher的模板题

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int N = 2e6+7;

int p[N];
char s[N];
int Manacher(char s[], int n)
{
    int Id=0, mx = 0, ans = 0;
    for(int i=2; i<n; i++)
    {
        if(mx > i)
            p[i] = min(p[Id*2-i], mx-i);
        else
            p[i] = 1;
        while(s[i+p[i]] == s[i-p[i]])
            p[i]++;
        if(mx < p[i]+i)
        {
            mx = p[i]+i;
            Id = i;
        }
        ans = max(ans, p[i]);
    }
    return ans - 1;
}
int main()
{
    int t=1;
    while(scanf("%s", s),strcmp(s, "END"))
    {
        int len = strlen(s);
        for(int i=len; i>=0; i--)
        {
            s[i+i+2] = s[i];
            s[i+i+1] = '#';
        }
        s[0] = '$';
        int ans = Manacher(s, 2*len+2);
        printf("Case %d: %d
", t++, ans);
    }
return 0;
}
View Code
原文地址:https://www.cnblogs.com/zhengguiping--9876/p/4851265.html