P3805 【模板】manacher算法
题目描述
给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
字符串长度为n
输入格式
一行小写英文字符a,b,c...y,z组成的字符串S
输出格式
一个整数表示答案
输入输出样例
输入 #1
aaa
输出 #1
3
说明/提示
字符串长度len <= 11000000
思路
代码
#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int N=31000010; char a[N],s[N]; int n,ans,hw[N]; void M() { int r=0,mid; for(int i=1; i<n; i++) { if(i<r) hw[i]=min(hw[(mid<<1)-i],hw[mid]+mid-i); else hw[i]=1; for(; s[i+hw[i]]==s[i-hw[i]]; ++hw[i]); if(hw[i]+i>r) { r=hw[i]+i; mid=i; } } } void change() { s[0]=s[1]='#'; for(int i=0; i<n; i++) { s[i*2+2]=a[i]; s[i*2+3]='#'; } n=n*2+2; s[n]=0; } int main () { scanf("%s",a); n=strlen(a); change(); M(); ans=1; for(int i=0; i<n; i++) ans=max(ans,hw[i]); printf("%d\n",ans-1); return 0; }