【模板】manacher
题目描述
给出一个只由小写英文字符 a,b,c,…y,z\texttt a,\texttt b,\texttt c,\ldots\texttt y,\texttt za,b,c,…y,z 组成的字符串 SSS ,求 SSS 中最长回文串的长度 。
字符串长度为 nnn。
输入格式
一行小写英文字符 a,b,c,⋯ ,y,z\texttt a,\texttt b,\texttt c,\cdots,\texttt y,\texttt za,b,c,⋯,y,z 组成的字符串 SSS。
输出格式
一个整数表示答案。
样例 #1
样例输入 #1
aaa
样例输出 #1
3
提示
1≤n≤1.1×1071\le n\le 1.1\times 10^71≤n≤1.1×107。
AC代码
#include<bits/stdc++.h>
using namespace std;
string s,oo;
int r,p[110000010],mid,ans;
void sol(string oo){
s+='~';
s+='*';
for(int i=0;i<oo.size();i++){
s+=oo[i];
s+='*';
}
}
int main(){
cin>>oo;
sol(oo);
for(int i=0;i<s.size();i++){
if(r>i) {
p[i]=min(r-i,p[2*mid-i]);
}else p[i]=1;
while(s[i+p[i]]==s[i-p[i]]) p[i]++;
if(i+p[i]>r){
r=i+p[i];
mid=i;
}
ans=max(ans,p[i]);
}
cout<<ans-1;
return 0;
}
3027



被折叠的 条评论
为什么被折叠?



