简介

  • 在字符串的题目中,有时会遇上 回文串 这样一个名词

  • 顾名思义,回文串 就是 正读和反读都一样的字符串

  • 最长回文子串 ,就是在一个字符串的所有子串中,是回文串且长度最长的那个

  • 求最长回文子串最普通的方法是 O(N2)O(N^2) ,即枚举一个点往两边扩展

  • 但是在有些题目中,N 却十分的大

  • 那么我们就要用到 时间空间复杂度都是 O(N)O(N) 的 Manacher 算法

用法

  • 在处理回文串时,我们常常会被 中间字符是一个还是两个 这样的问题困扰

  • 但是在机智的 Manacher 算法 中,这个问题得到了完美的解决

  • 在每两个字符中间插入一个不会出现的分隔符(如:#)

  • 之后在头尾插入一个还是没有出现的分隔符(如:*)来防止 While 出界

  • 这样处理起来就方便很多了!

  • 设读入的字符串为 s[i]s[i] ,

  • 记录 p[i]p[i] 表示 以 s[i]s[i] 为中心往两边扩展的最大长度

  • 观察可知,实际的回文串长度即为当前的 p[i]−1p[i]-1

  • 再记录一个数 idid , p[id]+idp[id]+id表示在 ii 位置前所有回文串中能延伸到的最右端的位置

  • 如下图:

  • 算法核心就是:

  • if(p[id]+id>i)if(p[id]+id>i) p[i]=min(p[id∗2−i],p[id]+id−i);p[i]=min(p[id*2-i],p[id]+id-i); elseelse p[i]=1;p[i]=1;

  • 当之前所有回文串中能延伸到的最右端覆盖过 ii 时,则取最小值,否则 p[i]=1p[i]=1 ,及自己本身

  • 这样不断维护 p[i]p[i] 和 idid ,就能在 O(N)O(N) 内求出 最长回文子串 了!

  • 至于为什么时间是线性的,由于最有端 p[id]+idp[id]+id 最多只能移动 N 次,

  • 有效移动的操作就严格线性啦!!

  • 下面附上模板:

void Manacher()
{scanf("%s",s);int len=strlen(s);for(int i=len;i>=0;i--){int k=i*2+1;s[k+1]=s[i],s[k]='#';}//插入分隔符len*=2;s[ans=id=0]='*';for(int i=2;i<=len;i++){if(p[id]+id>i) p[i]=min(p[id*2-i],p[id]+id-i); else p[i]=1;while(s[i-p[i]]==s[i+p[i]]) p[i]++;if(p[i]+i>p[id]+id) id=i;if(p[i]>ans) ans=p[i];}//处理、计算
}
  • 注释:s[i],p[i],ids[i],p[i],id 如题意义,ansans 表示 最长回文子串 的长度,而 lenlen 是原串长度

总结

  • 这个 Manacher 算法效率极高,时间空间都是 O(N)O(N) 线性的

  • 再者代码极短,所以使用起来十分方便,应多多使用!!!

Manacher 算法模板相关推荐

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

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

  2. 最长回文子串manacher算法模板

    #1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在 ...

  3. P3805 【模板】manacher算法

    思路 manache的板子 manacher是一种能在O(n)的时间复杂度内求出最长回文子串的一种算法 首先要在每个串之间加上'#',使得奇数长度和回文串和偶数长度的回文串可以被统一考虑 之后要在首位 ...

  4. P3805 【模版】manacher算法(manacher)

    P3805 [模版]manacher算法 题目描述 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 字符串长度为n 输入输出格式 输入格式: 一行小写英文字符a ...

  5. 牛客练习赛 57——manacher算法 树形dp?

    A - Tic-Tac-Toe 直接考虑每个人8种赢的情况即可. #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragm ...

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

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

  7. HDU3068 最长回文【manacher算法】

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

  8. URAL1297 Palindrome【manacher算法】

    1297. Palindrome Time limit: 1.0 second Memory limit: 64 MB The "U.S. Robots" HQ has just ...

  9. manacher算法学习(求最长回文子串长度)

    Manacher总结 我的代码 学习:yyb luogu题目模板 xzy的模板 #include<iostream> #include<cstdlib> #include< ...

最新文章

  1. 【一篇文章搞懂】Java社招最全面试题
  2. 云炬WEB开发笔记2-4 Sublime使用技巧
  3. boost::geometry::enrich_intersection_points用法的测试程序
  4. PHP判断变量内容是什么编码(gbk?utf-8) mb_detect_encoding
  5. oracle数据库中对varchar类型求max的解决方法
  6. 「十二省联考 2019」皮配——dp
  7. Python | 使用matplotlib.pyplot创建条形图
  8. python基础之01数据类型-变量-运算浅解
  9. android 05 桢布局:FrameLayout 网格布据 GridLayout
  10. 【JVM】G1垃圾回收器
  11. Struts2框架学习(二) Action
  12. 输入一个十进制数N,将它转换成R进制数输出(运用递归实现)
  13. 十种日常食物比砒霜还毒!
  14. Wingdings特殊字符及符号对照表
  15. 基于用户名/密码认证和流量控制 安装pam_mysql(太麻烦,已放弃;以下步骤可以参考,有报错解决...
  16. 麻省理工6.824 分布式课程 Raft选主实现笔记
  17. H.264编解码标准详解
  18. lbp纹理特征 MATLAB,毕业设计整理(六):LBP纹理特征
  19. 9012 递归求n的阶乘
  20. [测试通过]svn详细权限配置

热门文章

  1. Python学习笔记:Day 16 编写移动App
  2. 5.6 图像颜色映射
  3. 【转载】地球物理经典书目——成像方向
  4. 快慢指针寻找循环节点
  5. 论文阅读:Network In Network
  6. [云炬创业管理笔记]第三章打造优秀创业团队讨论3
  7. 超详细的 Bert 文本分类源码解读 | 附源码
  8. mariadb mysql版本对应_弹指神通MariaDB——MariaDB与MySQL各版本的区别
  9. 3DSlicer22:Module-ExtensionWizard Build Install
  10. 词法分析(1)---词法分析的有关概念以及转换图