bzoj2565

manacher

先用manacher求出p数组,f[i]表示以i结尾最靠左的回文中心,那么每次用i-f[i-p[i]]更新答案就可以了,感觉十分巧妙......

#include<bits/stdc++.h>
using namespace std;
const int N = 200010;
int n, len, ans, mx, pos;
int p[N], f[N];
char s[N], t[N];
int main()
{
    scanf("%s", t + 1);
    n = strlen(t + 1);
    s[0] = '!';
    s[len = 1] = '#';
    for(int i = 1; i <= n; ++i) s[++len] = t[i], s[++len] = '#';
    for(int i = 1; i <= len; ++i) 
    {
        if(i < mx) p[i] = min(p[2 * pos - i], mx - i);
        while(s[i - p[i]] == s[i + p[i]])
        {
            if(!f[i + p[i]]) f[i + p[i]] = i;
            ++p[i];
        }   
        if(i + p[i] > mx)
        {
            pos = i;
            mx = i + p[i];
        }
    }
    for(int i = 1; i <= len; ++i) ans = max(ans, i - f[i - p[i]]);
    printf("%d
", ans);
    return 0;
} 
View Code
原文地址:https://www.cnblogs.com/19992147orz/p/7553182.html