1 / 12
文档名称:

最长回文子串模板 (Manacher算法,时间复杂度O(n)).docx

格式:docx   大小:19KB   页数:12页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

最长回文子串模板 (Manacher算法,时间复杂度O(n)).docx

上传人:xunlai783 2018/1/5 文件大小:19 KB

下载得到文件列表

最长回文子串模板 (Manacher算法,时间复杂度O(n)).docx

相关文档

文档介绍

文档介绍://最长回文子串模板
//hdu3068,最长回文子串模板,Manacher算法,时间复杂度O(n),相当快
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define M 20000050
char str1[M],str[2*M];//start from index 1
int rad[M],nn,n;
void Manacher(int *rad,char *str,int n)/*str是这样一个字符串(下标从1开始):
举例:若原字符串为"abcd",则str为"$#a#b#c#d#",最后还有一个终止符。
n为str的长度,若原字符串长度为nn,则n=2*nn+2。
rad[i]表示回文的半径,即最大的j满足str[i-j+1...i] = str[i+1...i+j],
而rad[i]-1即为以str[i]为中心的回文子串在原串中的长度*/
{
int i;
int mx = 0;
int id;
for(i=1; i<n; i++)
{
if( mx > i )
rad[i] = rad[2*id-i]<mx-i?rad[2*id-i]:mx-i;
else
rad[i] = 1;
for(; str[i+rad[i]] == str[i-rad[i]]; rad[i]++)
;
if( rad[i] + i > mx )
{
mx = rad[i] + i;
id = i;
}
}
}
int main()
{
int i,ans,Case=1;
while(scanf("%s",str1)!=EOF)
{
nn=strlen(str1);
n=2*nn+2;
str[0]='$';
for(i=0;i<=nn;i++)
{
str[2*i+1]='#';
str[2*i+2]=str1[i];
}
Manacher(rad,str,n);
ans=1;
for(i=0;i<n;i++)
ans=rad[i]>ans?rad[i]:ans;
printf("%d\n",ans-1);
}
return 0;
}
//扩展kmp版,时间复杂度O(nlogn),稍慢
//hdu3068
/*给一个w长的字符串,求最长回文子串的长度
解题思路:不是传说中的高深的后缀数组,而是扩展的kmp算法。
扩展kmp中,模式串与主串都有一个next向量,相应的next[i],记录该串的后缀与模式串的最大匹配数,关于扩展kmp的具体实现这里就不说了,现在只说一下解此题的思路:
令所给字符串为a,则找到中点mid位置,一后半段做为模式串,把a倒过来生成b,求出b串在该模式串的每一位的next1[i];在以字符串a的前半段的逆串作为模式串,求出a串在该模式串下的next2。然后遍历a串的每一位,根据next1和next2就可以判断此处是否回文,但这个回文只能判断跨越中点mid的回文,因
此这里要进行划分递归,分别在a的前半段和后半段重复此算法即可找到最大回文串。
*/
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define N 110005
char tmp1[N],tmp2[N],s[N],tt[N];
int tmp[N],ans,ne1[N],ne2[N];
char *rev(char *str,int ll)
{
for(int i=0;i<ll;i++)
tt[i]=str[ll-i-1];
tt[ll]=0;
return tt;
}
void getA(char *pat,int *aa)
{
int j=0;
while(pat[1+j] && pat[j]==pat[1+j])
j++;
aa[1]=j;
int k=1;
int len,l;
for(int i=2;pat[i];i++)
{
len=k+aa[k];
l=aa[i-k];
if(l<len-i)
aa[i]=l;
else
{
j=(0>len-i)?0:len-i;
while(pat[i+j] && pat[j]==pat[i+j])
j++;
aa[i]=j;
k=i;
}
}
}
void getB(cha

最近更新

整式加法和减法 23页

教师培训中的教师专业发展与终身学习 26页

2024年蓝鲸的自述 16页

护肤产品与生活品质的关联与影响 23页

2024年营业员个人求职简历 17页

徽派建筑窗户简笔画立体图 24页

引领未来创新中小学人工智能教育方案的应用研.. 23页

建议可行性评估报告 30页

建立灵活与适应性强的组织结构与流程 23页

应用技术培训:提升医疗专业人员的实际操作能.. 25页

常见误区流感疫苗相关的知识普及 25页

小学各年级小小科技发明家主题班会 32页

2024年英语教研组工作总结(通用11篇) 30页

2024年英语教师德能勤绩廉个人总结(精选10篇.. 28页

小儿重症肺炎护理查房的神经功能保护与康复 19页

小儿重症肺炎护理查房合并症预防与诊治 23页

2024年英语一分钟演讲稿(精选21篇) 15页

2024年苦儿流浪记读后感(荐) 11页

2024年节约粮食倡议书通用15篇 20页

2024年艺术作文优秀(9篇) 12页

2024年航天飞机的自我介绍15篇 9页

环境问题举报文案范文11篇 22页

询价采购公告 8页

TBM安全操作规程 4页

准准131期-149期开始 10页

DL 5190.4-2019《电力建设施工技术规范第4部分.. 68页

最高人民法院关于贯彻宽严相济刑事政策的若干.. 15页

连云港船舶进出港计划表(共8篇) 45页

连云港船舶进出港码头计划 19页

普通话教程课件-普通话水平测试-课件(ppt·精.. 25页