manacher

//找最长回文字串
#include <bits/stdc++.h>
using namespace std;
const int N=2e7+2e6+10;
void in(int &x){
    x=0;char c=getchar();
    int y=1;
    while(c<'0'||c>'9'){if(c=='-')y=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+c-'0';c=getchar();}
    x*=y;
}
void o(int x){
    if(x<0){x=-x;putchar('-');}
    if(x>9)o(x/10);
    putchar(x%10+'0');
}
int ans=0;
int n,m,i,r,p,f[N],g[N];char a[N],s[N];
void up(int&a,int b){if(a<b)a=b;}
int main() {
    //while (1) {
        scanf("%s", a + 1), n = strlen(a + 1);
        for (i = 1; i <= n; i++)s[i << 1] = a[i], s[i << 1 | 1] = '#';
        s[0] = '$', s[1] = '#', s[m = (n + 1) << 1] = '@';
        for (r = p = 0, f[1] = 1, i = 2; i < m; i++) {
            for (f[i] = r > i ? min(r-i, f[p * 2-i]):1;
            s[i-f[i]]==s[i + f[i]];
            f[i]++);
            if (i + f[i] > r)r = i + f[i], p = i;
        }
        for (i = 0; i <= m; i++)g[i] = 0;
        for (i = 2; i < m; i++)up(g[i-f[i] + 1],i + 1);
        for (i = 1; i <= m; i++)up(g[i], g[i-1]);
        ans = 0;
        for (i = 2; i < m; i += 2)ans=max(ans,g[i]-i);
        o(ans);putchar('
');
    //}
}

原文地址:https://www.cnblogs.com/yesuweiYYYY/p/13915564.html