参考博客:Manacher算法--O(n)回文子串算法 - xuanflyer - 博客频道 - CSDN.NET

  从队友那里听来的一个算法,O(N)求得每个中心延伸的回文长度。这个算法好像比较偏门,不过还是稍微掌握一下会比较好。

  其实,我的理解就是,记录当前知道找到的最长的回文串的中心以及向右延伸后的最右端点位置。然后其中找最长回文串的操作其实还是暴力的,只不过这样记录两个位置以及覆盖了区间以后,下次我们要找的最长回文串的时候就可以借助这个已知信息减少大量的冗余查找。至于怎么证明这个剪枝可以使算法达到O(N)的复杂度,还是找资料比较好。

用hdu 3068这题测试,340ms通过:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <ctime>
 6
 7 using namespace std;
 8
 9 const int N = 111111;
10 char str[N], nstr[N << 1];
11 int p[N << 1];
12
13 int manacher(char *s) {
14     int id = 0, lf = 0, len = strlen(s), mx = 1;
15     p[0] = 1;
16     for (int i = 1; i < len; i++) {
17         if (lf > i) p[i] = min(p[(id << 1) - i], lf - i);
18         else p[i] = 1;
19         while (s[i + p[i]] && s[i + p[i]] == s[i - p[i]]) p[i]++;
20         if (lf < i + p[i] - 1) lf = i + p[i] - 1, id = i;
21         mx = max(p[i], mx);
22     }
23     return mx - 1;
24 }
25
26 int main() {
27     while (~scanf("%s", str)) {
28         char *p = str, *q = nstr;
29         while (true) {
30             *(q++) = '~', *(q++) = *p;
31             if (!*p) break;
32             p++;
33         }
34         //cout << nstr << endl;
35         cout << manacher(nstr) << endl;
36     }
37     return 0;
38 }

View Code

——written by Lyon

转载于:https://www.cnblogs.com/LyonLys/p/hdu_3068_Lyon.html

hdu 3068 最长回文 (Manacher算法求最长回文串)相关推荐

  1. Manacher算法 - 求最长回文串的利器

    求最长回文串的利器 - Manacher算法 Manacher主要是用来求某个字符串的最长回文子串. 不要被manacher这个名字吓倒了,其实manacher算法很简单,也很容易理解,程序短,时间复 ...

  2. HDU 5371 Hotaru's problem(Manacher算法+贪心)

    manacher算法详见 http://blog.csdn.net/u014664226/article/details/47428293 题意:给一个序列,让求其最大子序列,这个子序列由三段组成, ...

  3. HDU 3068 最长回文 manacher算法

    Manacher算法的裸题 下面简单说一下复杂度为O(n)的马拉车算法  首先过程中涉及到的变量有:  p[i]表示以t[i]字符为中心的回文子串的半径  id为最大回文子串中心的位置  mx是回文串 ...

  4. 最长回文(Manacher算法模板)

    题目描述 给出一个只由小写英文字符a,b,c-y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组case,不超过120组,每 ...

  5. Manacher马拉车算法求最长回文子串

    终于把马拉车算法搞明白了!赶紧记录一下. 这个算法用于查找一个字符串的最长回文子串 马拉车算法依次给数组p[i]赋值,马拉车算法的本质就是在每次给数组p[i] 赋值时尝试进行偷懒 例如,当要给p[6] ...

  6. python求回文_python实现求最长回文子串长度

    给定一个字符串,求它最长的回文子串长度,例如输入字符串'35534321',它的最长回文子串是'3553',所以返回4. 最容易想到的办法是枚举出所有的子串,然后一一判断是否为回文串,返回最长的回文子 ...

  7. 有n 个长为m+1 的字符串,求前后m个字符匹配所能形成的最长字符串链:利用弗洛伊德算法求最长路径...

    有n 个长为m+1 的字符串,如果某个字符串的最后m 个字符与某个字符串的前m 个字符匹配,则两个字符串可以联接,问这n 个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误. 把字符串看成 ...

  8. 动态规划算法---求最长公共子序列

    最长公共子序列和最长公共子串区别        最长公共子串(Longest Common Substring)与最长公共子序列(Longest Common Subsequence)的区别: 子串要 ...

  9. 【HDU - 3068】最长回文(Manacher算法,马拉车算法求最长回文子串)

    题干: 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.  回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组case,不超过120组 ...

最新文章

  1. [30期] 第一个项目
  2. python汉字转到ascii码_python中字母与ascii码的相互转换
  3. PHP: to use scptask, you need to install the SSH extension.
  4. 释疑のABAP内表的比较
  5. Qt Creator添加新的自定义向导
  6. HTTP 知识点之一:头部解释(转)
  7. Jakarta EE贡献–入门
  8. Springboot 项目中 xml文件读取yml 配置文件
  9. 端口数据[精通WindowsSocket网络开发-基于VC++实现]第二章——TCP/IP简介
  10. RHCE课程-RH033Linux基础笔记五之常用文本处理命令、输入输出重定向、管道
  11. 在WCF数据访问中使用缓存提高Winform字段中文显示速度
  12. 关于IPointerEnterHandler和IpointerExitHandler的简单说明
  13. 快逸报表研究-冻结表头
  14. 几年基础架构的经验之谈[42 things I learned from building a production database]
  15. vue项目中使用 echarts 创建一个关系图
  16. 【时空序列】使用3D卷积网络学习时空特征
  17. php 母版页,.NET_ASP.NET 2.0 中的创建母版页,  虽然母版页和内容页功能 - phpStudy...
  18. 《SysML精粹》学习记录--第二章
  19. 为了陪妹子打王者,没有天赋的我写了一个AI机器人替我操作
  20. 阿里云添加域名解析设置

热门文章

  1. Android中的savedInstanceState
  2. guassdb200 single node deployment
  3. 史上最简单JS复制功能,兼容安卓ios!
  4. 不带parent指针的successor求解
  5. tomcat8+idea远程调试
  6. AS报Failed to resolve: junit:junit:4.12错误正确的解决方法
  7. 知识总结: Activity的四种启动模式
  8. 使用java 遍历文件夹
  9. 模块的封装性分析-读书笔记
  10. Javascript开发的HTML5游戏的知识产权保护