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;
}

浙公网安备 33010602011771号