1. 程式人生 > >PAT ~ L2-008. 最長對稱子串 (Manacher)

PAT ~ L2-008. 最長對稱子串 (Manacher)

思路:裸的馬拉車演算法,,,字尾陣列應該也可以做

Manacher:

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1005 * 2;
int Manacher(string a)
{
    int len = a.size(), id = 0, MAX = 0, ans = -1, p[MAXN];
    memset(p, 0, sizeof(p));
    string s = "$#";
    for (int i = 0; i < len; i++){ s += a[i]; s += '#'; }
    len = len * 2 + 1;
    for (int i = 1; i <= len; i++)
    {
        if (MAX > i) p[i] = max(p[2 * id - i], MAX - i);
        else p[i] = 1;
        while(s[i - p[i]] == s[i + p[i]]) p[i]++;
        ans = max(ans, p[i]);
        if(MAX < p[i] + i)
        {
            MAX = p[i] + i;
            id = i;
        }
    }
    return ans - 1;
}
int main()
{
    string s;
    getline(cin, s);
    printf("%d", Manacher(s));
    return 0;
}
/*
Is PAT&TAP symmetric?
*/