Manacher

#include<bits/stdc++.h>
#define ri register int
#define ll long long
#define fast ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
using namespace std;
const inline int read(){
    int k = 0, f = 1; char c = getchar();
    for(;!isdigit(c); c = getchar())
        if(c == '-') f = -1;
    for(;isdigit(c); c = getchar())
        k = k * 10 + c - '0';
    return k * f;
}
#define maxn 11000005
int len, p[maxn * 2], ans = 0;
char s[maxn], ss[maxn * 2];
void manacher(char *s, int len){
    int l = 0;
    ss[l++] = '$';
    ss[l++] = '#';
    for(ri i = 0; i < len; ++i){
        ss[l++] = s[i];
        ss[l++] = '#';
    }
    ss[l] = 0;
    int mx = 0, po = 0;
    for(ri i = 1; i < l; ++i){
        if(mx > i)
            p[i] = min(mx - i, p[2 * po - i]);//继承对称点的值||继承到边界继续搜 
        else
            p[i] = 1;
        while(ss[i - p[i]] == ss[i + p[i]])//以i为中心搜索 
            p[i]++; 
        if(p[i] + i > mx){//最右点mx更新 
            mx = p[i] + i;
            po = i;
        }
        ans = max(ans, p[i]);
    }
}
int main(){
    fast; 
    cin >> s;
    len = strlen(s);
    manacher(s, len);
    ans--;//p[i] - 1 == 以该点为中心回文串的长度 
    cout << ans;
} 

https://www.cnblogs.com/z360/p/6375514.html

posted @ 2020-03-29 14:32  kojoker  阅读(144)  评论(0)    收藏  举报