您的位置:首页 > 其它

Mancher求最大回文子串 Hdu 3068

2016-08-11 14:39 393 查看
                                    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();
}
}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: