博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
manachaer算法
阅读量:5938 次
发布时间:2019-06-19

本文共 1059 字,大约阅读时间需要 3 分钟。

它可以做什么?

马拉车manachaer算法可以在O(n)的时间内求出字符串中的最长回文串长度

它是怎么实现的?

考虑f[i]表示字符串中以第i个字符为中心的最长回文串长度,求f[i]时,若已求出的回文串中末端最靠右者f[maxmid]的末端位置的位置maxright>i,表明i与位置 2*maxmid-i关于maxmid对称,则f[i]可以通过f[2*maxmid-i]更新,否则f[i]设置为1

需要注意的是,由于maxright右侧的字符情况未知,所以f[i]最大只能更新到2*(maxright-i)+1

之后,暴力延长f[i]判断即可

这样就求出了所有以i为中心的最长回文串的长度

可是……这样求出的回文串长度是奇数的,偶数长度怎么办?

我们可以通过在字符之间插入一些奇奇怪怪的无关字符来使得原字符串长度为奇数,这样就可以方便地求出所有f[i],只需在输出答案时处理一下即可

真棒,那代码呢

#include 
#include
#include
#include
#include
#include
#define maxlen 11000010using namespace std;char in[maxlen],str[2*maxlen];int len;int ans,f[2*maxlen];int main(){ register int i; scanf("%s",in+1); len=strlen(in+1); str[1]='#',str[0]='^'; for(i=1;i<=len;++i) { str[i*2]=in[i]; str[i*2+1]='#'; } f[1]=1; len=strlen(str+1); int nowmid=1,nowright=1; for(i=1;i<=len;++i) { if(i
nowright) { nowmid=i; nowright=i+x; } ans=max(ans,f[i]); } printf("%d",ans/2); return 0;}//by:liz

上面的代码可以直接运行于Luogu 3805

转载于:https://www.cnblogs.com/lizbaka/p/manachaer.html

你可能感兴趣的文章
最大权闭合子图题目泛做
查看>>
js中计算两个日期之差
查看>>
ktv项目测试总结
查看>>
内核如何签名
查看>>
彻底弄懂小程序e.target与e.currentTarget
查看>>
岭回归名字由来
查看>>
Nodejs mongodb 管理组件adminmongodb
查看>>
Vue.js 数据绑定语法详解
查看>>
PhpStorm常用快捷键(不多够用)
查看>>
html5--5-8 绘制圆/弧
查看>>
html5--项目实战-仿360囧图
查看>>
Element-UI tree 组件 点击后高亮显示的样式修改(背景色)
查看>>
c# Winform中如何把图片添加到resources中
查看>>
最后一道题整个给干蒙了
查看>>
5.9
查看>>
《构建之法》读书笔记05
查看>>
SQL-1 选取表中某一属性最大值的所有信息 查找最晚入职员工的所有信息
查看>>
SQL-52 获取Employees中的first_name,查询按照first_name最后两个字母,按照升序进行排列...
查看>>
N-10矩形覆盖
查看>>
博弈论——一周目小结
查看>>