Mancher求最大回文子串 Hdu 3068

本文详细介绍Manacher算法,一种用于寻找字符串中最长回文子串的有效算法。通过动态规划的方法,利用回文串的对称性,该算法能够在O(n)的时间复杂度内找到答案。文章提供了完整的C++实现代码,并解释了关键步骤。

                                    Manacher

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<string>
#define rep(i,a,b) for(int i=a; i<=b; ++i)
#define per(i,a,b) for(int i=a; i>=b; --i)
#define write(A) printf("%d\n",A);
#define M 200001
using namespace std;
string s,str;
int Max,Maxi;
int Len_s,Len_str;
void manacher()
{
  int *p=new int[Len_str+10];
  Max=0; Maxi=0;
  memset(p,0,sizeof(p)); 
  int mx=0,id=0;
  rep(i,1,Len_str)
  { 
    if(mx>i) p[i]= p[2*id-i]<mx-i?p[2*id-i]:mx-i; else p[i]=1; //利用小串对称点与大串关系更新
    while(str[i-p[i]]==str[i+p[i]]) ++p[i];
	if(i+p[i]>mx) mx=i+p[i],id=i;
  }
  rep(i,1,Len_str) if(p[i]>Max) Max=p[i], Maxi=i; --Max;//显然当前字符不能算两次
  write(Max);
  delete p;//删去动态的p,节省空间
  return;
}
int main()
{
  while(cin>>s)
  {
    Len_s=s.length();
    str="$#";//这是马拉车的初始化,因为方便p的计算,于是加上奇怪字符,用string类型
    rep(i,0,Len_s-1)str+=s[i],str+="#";//显然char类型没有强大的功能
    Len_str = str.length();
    manacher();
  }
}


                
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值