【模板】manacher算法

题目描述
给出一个只由小写英文字符a,b,c…y,z组成的字符串S,求S中最长回文串的长度.

字符串长度为n

输入输出格式
输入格式:
一行小写英文字符a,b,c…y,z组成的字符串S

输出格式:
一个整数表示答案

输入输出样例
输入样例#1:
aaa
输出样例#1:
3
说明
字符串长度len <= 11000000

//By Menteur_Hxy
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

const int MAX=11000100;
const int INF=0x3f3f3f3f;
int len,p[MAX*3];
char a[MAX*3]={'-'}; 

void manacher() {
    int mx=0,id=0;
    for(int i=0;i<=len;i++) {
        if(mx>p[i]) p[i]=min(p[id*2-i],mx-i);
        else p[i]=1;
        while(a[i+p[i]]==a[i-p[i]]&&i+p[i]<=len&&i-p[i]>=0) p[i]++;
        if(i+p[i]>mx) mx=i+p[i],id=i;
    }
}

int main() {

    while(1) {
        char c=getchar();
        if(c=='
' || c==EOF) break;
        a[++len]=c;
        a[++len]='-';
    }
//  for(int i=0;i<=len;i++) cout<<a[i];
//  cout<<endl;
    manacher();
    int ans=0;
    for(int i=0;i<=len;i++)
        if(p[i]>ans) ans=p[i];
    printf("%d",ans-1);
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 博主:https://www.cnblogs.com/Menteur-Hxy/
原文地址:https://www.cnblogs.com/Menteur-Hxy/p/9248006.html