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,方便计算。

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

  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. const int MAX_2L = 220010;
  5. char txt[MAX_2L];
  6. int P[MAX_2L];
  7. int len;
  8. inline int min(int a, int b) { return a < b? a : b; }
  9. inline int max(int a, int b) { return a > b? a : b; }
  10.  
  11. void preProcess()
  12. {
  13. len = strlen(txt);
  14. int i = len-1, j = (len<<1);
  15. txt[j+2] = '\0';
  16. txt[j+1] = '#';
  17. for ( ; i >= 0; i--)
  18. {
  19. txt[j--] = txt[i];
  20. txt[j--] = '#';
  21. }
  22. txt[0] = '~';
  23. }
  24.  
  25. int main()
  26. {
  27. while (gets(txt))
  28. {
  29. preProcess();
  30. len = len << 1 | 1;
  31. int maxLen = 0, right = 0, center = 0;
  32. for (int i = 1; i <= len; i++)
  33. {
  34. P[i] = i<right ? min(P[(center<<1)-i], right-i) : 1;
  35. while (txt[i-P[i]] == txt[i+P[i]]) P[i]++;
  36.  
  37. maxLen = max(maxLen, P[i]);
  38.  
  39. if (right < i+P[i]) center = i, right = i+P[i];
  40. }
  41. printf("%d\n", maxLen-1);
  42.  
  43. gets(txt); //get rid of empty line
  44. }
  45. return 0;
  46. }

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. 【LigerUI】ajax请求firefox返回NS_BINDING_ABORTED

    在ligergrid中请求链接,post提交,返回NS_BINDING_ABORTED. 是因为ligergrid中默认是异步提交方式,如果没有设置同步的话, 在请求该链接的时候第一次请求还没有执行完 ...

  2. ios多视图开发中:xib与UIViewController的关联

    个人感觉ios中的UIViewController和xib文件,分别相当于android的Activity 和Layout文件 当时两者的关联比android稍微复杂些. ios上分别新建的UIVie ...

  3. applicationContext.xml详解

    http://blog.csdn.net/heng_ji/article/details/7022171

  4. XHTML 基础(含部分css)

    基于http://www.ycku.com/xhtml/ 的视频教程的一些笔记 关于xhtml的解释 引用百度百科 可扩展超文本标记语言,是一种置标语言,表现方式与超文本标记语言(HTML)类似,不过 ...

  5. 原生js仿jquery--animate效果

    效果 代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  6. android之IntentFilter的用法_Intent.ACTION_TIME_TICK在manifest.xml不起作用

    在模仿一个天气预报的widget时候,用到了IntentFilter,感觉在manifest.xml注册的receiver跟用代码写registerReceiver()的效果应该是相同的,于是想证明一 ...

  7. Use Node.js DDP Client on Arduino Yun to Access Meteor Server

    Use Node.js DDP Client on Arduino Yun to Access Meteor Server 概述 在Arduino Yun上安装 Node.js, 并測试与 Meteo ...

  8. css3处理sprite背景图压缩来解决H5网页在手机浏览器下图标模糊的问题

    近期在负责一个微信H5 App项目,遇到一个郁闷的问题,手机浏览器查看网页时图标都是模糊的,有锯齿,电脑浏览器显示则是正常.大概知道是分辨率适配等类型的问题,后来网上查找了一些办法.大部分的解决方式都 ...

  9. hdu1248

    Problem Description 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票(记住,只有一张钞票),为了防止自己在战斗中频繁的死掉,他决定给自己买一些道具,于是他来到了地精商店前. 死亡 ...

  10. Struct初学的,页面跳转

    Filter控制器 jsp页面代码 <form action="page_login.action" method="post">     user ...