【模板】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=='\n' || 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/