hdu3068-最长回文-manacher算法

如果是暴力算法会超时。
这里采用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;
 }
}
发布了16 篇原创文章 · 获赞 1 · 访问量 270

猜你喜欢

转载自blog.csdn.net/weixin_44254608/article/details/104654444