mannachar(马拉车)求最长回文子串
来源:互联网 发布:广东省工商局网络培训 编辑:程序博客网 时间:2024/06/05 18:41
mannachar(马拉车)究竟是什么东西呢?
很简单,就是能让你在O(n)的复杂度内求出一个串的最长回文子串。传统的算法复杂度是O(n^2),呐,为什么mannachar能变快呢?因为mannachar用到了算过的东西来进行优化。脑补一下,当你发现了一个回文串,那么是不是左右就对称了呢?然后左边的最长回文子串是已经求过了,所以右边对应的点的最长回文子串至少也有那么多。
先贴一波代码
#include<cstdio>#include<cstring>template <typename T>inline T max(const T x,const T y){return x>y?x:y;}template <typename T>inline T min(const T x,const T y){return x<y?x:y;}char s[11000001],t[22000010];int p[22000002],len,l;int main(){ scanf("%s",s+1),len=strlen(s+1); t[l++]='$',t[l++]='#'; for(register int i=1;i<=len;i++) t[l++]=s[i],t[l++]='#'; int maxx=0,num=0,res=0; for(register int i=0;i<l;i++) { p[i]=maxx>i?min(p[(num<<1)-i],maxx-i):1; while(t[i+p[i]]==t[i-p[i]])p[i]++; if(i+p[i]>maxx) { maxx=i+p[i]; num=i; } res=max(res,p[i]); } printf("%d",res-1); return 0;}
它的复杂度是O(n)的,为什么呢?请看我的代码中的maxx这个变量表示现在最长回文子串的右边界的最远值,最多移动n次,复杂度就证好啦
其实mannachar并不难,不过说实话用的场合不是很多,所以嘛,学一下,掌握一下就好啦,再去学字符串的其它算法组合一下就能做出一些题啦
阅读全文
0 0
- mannachar(马拉车)求最长回文子串
- Manacher马拉车算法求最长回文子串
- 最长回文子串-----“马拉车”算法
- 最长回文子串(马拉车)
- HDU 3068 manachar(马拉车)算法 求最长回文子串
- 求字符串的最长回文子串--最直观的“马拉车算法”分析
- hihoCoder 最长回文子串(manacher算法:马拉车)
- hihoCoder-1032 - 最长回文子串(Manacher 马拉车)
- 求最大回文子串(马拉车算法)
- 最长回文 --马拉车算法
- 【LeetCode】Longest Palindromic Substring(最长回文子串1)[马拉车Manacher算法]
- 求最长回文子串
- 求最长回文子串
- 求最长回文子串
- 求最长回文子串
- 求最长回文子串
- 求最长回文子串
- 求最长回文子串
- Greendao+多线程断点续传
- Date与LocalDate,LocalDateTime,LocalTime的转换
- 共用体
- vim自动排版
- malloc题目
- mannachar(马拉车)求最长回文子串
- linux常用操作命令
- 深度学习之深度生成模型
- 网页AngularJS购物车
- golang 格式“占位符”%d,%f,%s等应用类型
- 遍历文件夹下某种某种所有文件类型
- 第一次简单的实现
- 三子棋
- ROS_Dynamic Reconfig 动态参数调节