Manacher

P3805 【模板】manacher 算法

#include <bits/stdc++.h>

using namespace std;

const int N = 2.2e7 + 7;

int n, ans, mid, mr, f[N];

char s[N], c;

int main() {
    s[++n] = '~';
    while(scanf("%c", &c) != -1) {
        s[++n] = '#';
        s[++n] = c;
    }
    s[++n] = '#';
    // printf("%s", s + 1);
    mid = mr = 1;
    for (int i = 2; i <= n; i++) {
        if (i < mr) {
            f[i] = min(f[(mid << 1) - i], mr - i + 1);
        } else {
            f[i] = 1;
        }
        while(s[i + f[i]] == s[i - f[i]]) {
            f[i]++;
        }
        if (i + f[i] - 1 > mr) {
            mr = i + f[i] - 1;
            mid = i;
        }
    }
    int ans = 1;
    for (int i = 1; i <= n; i++) ans = max(ans, f[i] - 1);
    printf("%d\n", ans);
    return 0;
}