题目链接

manacher算法:在线性时间内求一个字符串中所有/最长回文串的算法。

先来考虑一下暴力的算法,枚举每个中点,向两边扩展,时间复杂度\(O(n^2)\)。

来分析下此算法的缺点。

1、因为回文串有奇偶之分,所以要分类讨论,\(abba\)的对称轴不在字符上,分类讨论就会有点麻烦。

为此,\(manacher\)算法的解决方案是在每个字符之间插入一个相同的字符,比如说\(\#\),

\(ababa->\#a\#b\#a\#b\#a\#\),这样就不用考虑回文串的奇偶性了。

2、效率低。为什么低?每个位置会被重复遍历。和\(KMP\)算法类似,\(manacher\)也是利用已有信息减少重复无用操作。

比如说\(abacaba\),这是一个回文串,但两边的\(aba\)也都是一个回文串,我们在枚举到右边的\(b\)时就已经能确定已这个\(b\)为中心的回文串的回文半径至少为\(2\),然后直接从这个长度开始拓展就好了。设\(hw[i]\)表示以\(a[i]\)为回文中心的回文半径长度,\(maxright\)表示当前已发现的右端点最右的右端点,\(mid\)表示这个回文串的中心。

则有如下算法(我觉得看代码比看讲解容易懂些)

for(int i = 1; i < len; ++i){
if(i < maxright)
hw[i] = min(hw[(mid << 1) - i], hw[mid] + mid - i); //min左边的参数是这个点的对称点的hw值,右边的是保证这个部分在这个大回文串之内
else hw[i] = 1;
while(a[i + hw[i]] == a[i - hw[i]]) ++hw[i]; //拓展
if(hw[i] + i > maxright){ //更新右端点
maxright = hw[i] + i;
mid = i;
}
}

该题完整代码

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 11000010;
char b[MAXN], a[MAXN << 1];
int hw[MAXN << 1], ans, n;
int main(){
scanf("%s", b);
a[0] = a[1] = '#';
int len = strlen(b);
for(int i = 0; i < len; ++i)
a[(i << 1) + 2] = b[i], a[(i << 1) + 3] = '#';
int maxright = 0, mid; len = (len << 1) + 3;
for(int i = 1; i < len; ++i){
if(i < maxright)
hw[i] = min(hw[(mid << 1) - i], hw[mid] + mid - i);
else hw[i] = 1;
while(a[i + hw[i]] == a[i - hw[i]]) ++hw[i];
if(hw[i] + i > maxright){
maxright = hw[i] + i;
mid = i;
}
ans = max(ans, hw[i] - 1);
}
printf("%d\n", ans);
return 0;
}

最新文章

  1. Google数据中心B4网络具体实现
  2. UItableView与UICollectionView
  3. switch多分支语句
  4. Windows计划任务执行时不显示窗口的问题
  5. 实现自己的Linq to Sql
  6. CentOS 实现自动登陆
  7. Unity 关于属性的get/set
  8. ajax不执行success回调而是执行了error回调
  9. plupload插件的错误SCRIPT601
  10. 本地安装plsql和instantclient连接linux服务器端的oracle
  11. LeetCode(37)-Minimum Depth of Binary Tree
  12. css3D的魅力
  13. IOS开发中关于runtime的认识
  14. 使用Visual Studio 2017 C++17模块(module)特性
  15. 统计硬币 HDU - 2566 (三种解法:线性代数解法,背包解法,奇思妙想解法 &gt;_&lt; )
  16. 【react】---pureComponent的理解
  17. C# 通过调用Win32 API函数清除浏览器缓存和cookie
  18. Excel根据单元格内容设置整行颜色
  19. CentOS7.5之Sqoop1.4.7的安装使用
  20. Grid Search学习

热门文章

  1. thrift 调取 python php go 客户端代码
  2. MySQL数据库服务器逐渐变慢分析
  3. EntityFramewrok 使用
  4. Linux-Shell脚本编程-学习-3-Shell编程-shell脚本基本格式
  5. iFIERO - (二)宇宙大战 Space Battle -- SpriteKit 无限循环背景Endless、SpriteKit物理碰撞、CoreMotion加速计
  6. 孤荷凌寒自学python第七十一天开始写Python的第一个爬虫
  7. Linux编译安装opencv
  8. nohup追加日志
  9. kvm-1
  10. HDU 4569 Special equations(枚举+数论)(2013 ACM-ICPC长沙赛区全国邀请赛)