如果是暴力算法会超时。
这里采用manacher算法。
↓从知乎转载到博客的一篇比较容易理解的manacher算法描述
戳我鸭
下面是ac代码
#include<iostream>
#include<string>
#include<algorithm>
#define maxn 110000*2+5//记住要x2,因为扩展了字符串!如果没有规定好,会导致超时
using namespace std;
int p[maxn];
//准备,修改字符串,插入‘#’
string pre(string str)
{
int n=str.size();
if(n==0) return "^s";
string temp="^";
for(int i=0;i<str.size();i++)
{
temp+="#";
temp+=str[i];
}
temp+="#$";
return temp;
}
//manacher算法
int manacher(string str)
{
string s=pre(str);
int n=s.size();
int c=0;//c是中心
int r=0;//r是右边界
int ans=0;
for(int i=1;i<n-1;i++)
{
int i_mir=2*c-i;//找到i对称于c的坐标
if(r>i)
{
p[i]=min(r-i,p[i_mir]);//防止超出c
}
else
{
p[i]=0;//i==r
}
while(s[i+p[i]+1]==s[i-p[i]-1])
{
p[i]++;
}//计算回文数
if(i+p[i]>r)
{
r=i+p[i];
c=i;
}//更新c和r
ans=max(ans,p[i]);
}
return ans;
}
int main()
{
string str;
while(cin>>str)
{
int ans=manacher(str);
cout<<ans<<endl;
}
}