Manacher算法是个解决Palindrome问题的O(n)算法,能够说是个超级算法了,秒杀其它一切Palindrome解决方式,包含复杂的后缀数组。

网上非常多解释,最好的解析文章当然是Leetcode的了:http://leetcode.com/2011/11/longest-palindromic-substring-part-ii.html

这里总结一下思想重点:

1 原字符串的字符间插入新的字符, 如#,方便统一全部的字符中心,比方aa和aba的字符中心不一样的,aa的字符中心能够说是aa,而aba的中心则是b,而插入#之后,aa成#a#a#,当中心是一个字符#,而aba插入#a#b#a#,中心还是一个字符b。

2 充分利用前面已经计算出的信息来计算后面的信息,这里主要利用palindrome的对称性的特性,那么就能够利用对称中心前半段的信息计算后半段的信息了。这个是优化算法到O(n)的关键。 由于对称中心是不断右移的,故此在对称中心内的求解仅仅需直接copy前半段的信息就能够,而超出当前对称范围的就须要expand Palindrome了。

3 防止溢出,前面加一个额外的特殊字符,如'~',和前面的插入字符不一样。后面也须要插入字符,可是为什么非常多程序不插入字符呢?那是由于C++的char都是以'\0'结束的,故此,不插入也是能够的,以下程序明显插入'\0'到结尾了。

4 须要维护最右点信息,中心信息和P数组,P数组的含义是以i点为中心的最长palindrome子字符串的长度,这里是长度+1,方便计算。

关键代码就几行,可是思想却是十分难的。

#include <stdio.h>
#include <string.h> const int MAX_2L = 220010;
char txt[MAX_2L];
int P[MAX_2L];
int len;
inline int min(int a, int b) { return a < b? a : b; }
inline int max(int a, int b) { return a > b? a : b; } void preProcess()
{
len = strlen(txt);
int i = len-1, j = (len<<1);
txt[j+2] = '\0';
txt[j+1] = '#';
for ( ; i >= 0; i--)
{
txt[j--] = txt[i];
txt[j--] = '#';
}
txt[0] = '~';
} int main()
{
while (gets(txt))
{
preProcess();
len = len << 1 | 1;
int maxLen = 0, right = 0, center = 0;
for (int i = 1; i <= len; i++)
{
P[i] = i<right ? min(P[(center<<1)-i], right-i) : 1;
while (txt[i-P[i]] == txt[i+P[i]]) P[i]++; maxLen = max(maxLen, P[i]); if (right < i+P[i]) center = i, right = i+P[i];
}
printf("%d\n", maxLen-1); gets(txt); //get rid of empty line
}
return 0;
}

HDU 3068 最长回文 Manacher算法的更多相关文章

  1. hdu 3068 最长回文 manacher算法(视频)

    感悟: 首先我要Orz一下qsc,我在网上很难找到关于acm的教学视频,但偶然发现了这个,感觉做的很好,链接:戳戳戳 感觉这种花费自己时间去教别人的人真的很伟大. manacher算法把所有的回文都变 ...

  2. HDU 3068 最长回文 manacher 算法,基本上是O(n)复杂度

    下面有别人的比较详细的解题报告: http://wenku.baidu.com/view/3031d2d3360cba1aa811da42.html 下面贴我的代码,注释在代码中: #include ...

  3. HDU - 3068 最长回文manacher马拉车算法

    # a # b # b # a # 当我们遇到回判断最长回文字符串问题的时候,若果用暴力的方法来做,就是在字符串中间添加 #,然后遍历每一个字符,找到最长的回文字符串.那么马拉车算法就是在这个基础上进 ...

  4. hdu 3068 最长回文 manacher

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正 ...

  5. hdu 3068 最长回文(manacher&amp;最长回文子串)

    最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  6. hdu 3068 最长回文(manacher入门)

    最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  7. HDU - 3068 最长回文(manacher)

    HDU - 3068 最长回文 Time Limit: 2000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Subm ...

  8. hdu 3068 最长回文(manachar求最长回文子串)

    题目连接:hdu 3068 最长回文 解题思路:通过manachar算法求最长回文子串,如果用遍历的话绝对超时. #include <stdio.h> #include <strin ...

  9. hdu_3068 最长回文(Manacher算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 最长回文 Time Limit: 4000/2000 MS (Java/Others)    M ...

随机推荐

  1. JAVA 软件升级版本号比较

    简单版本号比较: public class CompareVersion {   public static void main(String[] args) { // TODO Auto-gener ...

  2. Hibernate + Spring (quartz) 整合懒(延迟)加载问题

    开发项目的时候 在一个Job中执行了数据库操作, 用的是懒加载,但是如下错误 org.hibernate.LazyInitializationException: failed to lazily i ...

  3. iOS 开发设计常用软件及工具整理

    1, xCode 2, AppCode 3, Skech 原型设计软件 4, Hype 动画设计工具 5, fontawsome 免费图表 6, Prepo icon, images.catlog 生 ...

  4. codeigniter ,看完这些,就可以用它做项目了

    一.MVC 1,入口文件 唯一一个让浏览器直接请求的脚本文件 2,控制器 controller 负责协调模型和视图 3,模型 model 只负责提供数据,保存数据 4,视图 只负责显示,以及搜集用户的 ...

  5. CGroup 介绍、应用实例及原理描述

    CGroup 介绍 CGroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制.记录.隔离进程组 (process groups) 所使用的物力资源 (如 cpu ...

  6. Week12(11月25日)

    Part I:提问 =========================== 1.如何删除一条记录? Part II:理论学习 =========================== 到目前为止,我们考 ...

  7. js中innerHTML与innerText的用法与区别

    用法: <div id="test">    <span style="color:red">test1</span> te ...

  8. Qt Chart 5.7.0 傻瓜安装教程

    前提 qtchart 里的README文件(注意红色标记处)(本人翻译不行.多多见谅,也可以在评论里纠正( ⊙ o ⊙ )) --------------- Qt Charts 5.7.0 ----- ...

  9. Smarty模板Windows下写代码 放到CentOS6.5无法正确解析

    如题:报错: Unable to load template file 'System/header.htm' in '/var/www/website/cms/Template/Default/We ...

  10. 14 - XML、JSON、PLIST对比和APP生命周期

    XML中间的 数据表达/传输数据的语言 优点:特别强大 强大到很多平台都有基于XML的独立语言,如MXML.HTML 缺点:传输小型数据时,特别啰嗦 size / speed = time JSON ...