目录

Manacher算法 可在 \(O(n)\)的时间内求出一个字符串以每个位置为中心的最长回文子串。

原理:根据之前预处理出的回文串长度求得新的回文串长度

我们可以通过在字符中加上'#'来避免长度为偶数回文串没有中心的问题

原串 = "abcd"; 变为
新串 = "#a#b#c#d#";
原串中长度为奇数和偶数的回文串的长度均变为奇数,且原串中回文串的长度为新串回文串半径减一。

设置两个状态 $\max $ 和 \(p\) , \(p\) 表示当前已找到的回文串中,向右延伸最远的中心位置,$\max $ 表示其右端点。

设 \(r(i)\) 表示(新串中)第 \(i\) 个位置的回文半径(回文串长度的一半,包括第 \(i\) 个字符)按从左到右的顺序求解,枚举到第 \(i\) 个字符时,分三种情况考虑:

设\(\ j\) 为\(\ i\) 关于 \(p\) 的对称点,即 \(j = 2p - i\)

\(\max < i​\),即向右延伸最远的回文子串(黑色)没有覆盖 \(i​\),此时只有 \(r(i) \geq 1​\)。

\(\max \geq i\) 且 \(\max - i \geq r(j)\),即向右延伸最远的回文子串(黑色)覆盖了 \(i\),并且以 jj 为中心的最长回文子串完全与以 \(i\) 为中心的最长回文子串对称(蓝色),此时一定有 \(r(i) = r(j)\),即 \(r(i) \geq r(j)\)。

\(\max \geq i\) 且 \(\max - i \geq r(j)\),即向右延伸最远的回文子串(黑色)覆盖了 \(i\),但没有覆盖以 jj 为中心的最长回文子串的对称位置串,所以 \(r(i)\) 只能取被覆盖的(黄色)一部分,即 \(r(i) \geq \max - i\)。

code(伪)

int len;
void prepare(){
len = 0;
s2[++len] = '%';
for(int i = 0; i < s.size(); i++){
s2[++len] = '#';
s2[++len] = s[i];
}
s2[++len] = '#';
}
void manacher(){
int mid = 0, rb = 0;
//此处的rb是 真实值加一
//回文串为(lb, rb) (lb, mid] = [mid, rb) 所以计算半径直接rb - mid;
//因为每次扩展x相当于扩展rb, rb最多扩展n次, 所以O(N);
for(int i = 1; i <= len; i++) {
int x;
if(rb < i) x = 1;
else x = min(p[2*mid - i], rb - i); while(s2[i+x] == s2[i-x]) x++; if(i > rb) mid = i, rb = i+x;
p[i] = x;
}
} ans = max(p[]) - 1;
//原串回文串长度等于新串回文半径减一.

Manacher学习笔记的更多相关文章

  1. Manacher 学习笔记

    \(\\\) \(Manacher\) 一种常用的字符串算法,用于处理一些回文字符相关的问题. 回文串:从前向后和从后向前输出一致. 回文中心:以这里开始,每次向外左右各扩展一个字符得到的回文串的中心 ...

  2. Manacher算法学习笔记 | LeetCode#5

    Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...

  3. 学习笔记 - Manacher算法

    Manacher算法 - 学习笔记 是从最近Codeforces的一场比赛了解到这个算法的~ 非常新奇,毕竟是第一次听说 \(O(n)\) 的回文串算法 我在 vjudge 上开了一个[练习],有兴趣 ...

  4. 【学习笔记】字符串—马拉车(Manacher)

    [学习笔记]字符串-马拉车(Manacher) 一:[前言] 马拉车用于求解连续回文子串问题,效率极高. 其核心思想与 \(kmp\) 类似:继承. --引自 \(yyx\) 学姐 二:[算法原理] ...

  5. OI知识点|NOIP考点|省选考点|教程与学习笔记合集

    点亮技能树行动-- 本篇blog按照分类将网上写的OI知识点归纳了一下,然后会附上蒟蒻我的学习笔记或者是我认为写的不错的专题博客qwqwqwq(好吧,其实已经咕咕咕了...) 基础算法 贪心 枚举 分 ...

  6. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  7. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  8. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  9. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

随机推荐

  1. func_get_args函数

    func_get_args ------获取一个函数的所有参数 function foo() { $numargs = func_num_args(); //参数数量 echo "参数个数是 ...

  2. IDEA抛出No bean named 'cacheManager' available解决方法

    (正确的,老师发我的) <?xml version="1.0" encoding="UTF-8"?><beans xmlns="ht ...

  3. python爬虫-淘宝商品密码(图文教程附源码)

    今天闲着没事,不想像书上介绍的那样,我相信所有的数据都是有规律可以寻找的,然后去分析了一下淘宝的商品数据的规律和加密方式,用了最简单的知识去解析了需要的数据. 这个也让我学到了,解决问题的方法不止一个 ...

  4. SHELL打印两个日期之间的日期

    SHELL打印两个日期之间的日期 [root@umout shell]# cat date_to_date.sh THIS_PATH=$(cd `dirname $0`;) cd $THIS_PATH ...

  5. Oracle数据库执行exp命令--报参数'log' 不允许有多个值

    前几天设置自动备份oracle 数据库时发现一个问题,自动备份老是执行失败,后来把语句拿出来单独执行才发现是语句写的有问题,一般情况下自动备份都要自动生成日志文件,以便于我们查看备份是否正常执行.下面 ...

  6. Asp.net 与 UCenter 用户同步之实施过程

    在写这篇文章的时候,我还在想,这篇文章也许能给你带来一些收获,但或许会令你更加的迷茫,为什么会这样?因为:1.UCenter虽然足够强大,但正为它的强大,它的不少暗箱操作使得我们望而生畏,我们不害怕出 ...

  7. Flink的广播变量

    Flink支持广播变量,就是将数据广播到具体的taskmanager上,数据存储在内存中,这样可以减缓大量的shuffle操作: 比如在数据join阶段,不可避免的就是大量的shuffle操作,我们可 ...

  8. jav实验二

    实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 实验内容 1.参考Intellj ID ...

  9. Codechef EDGEST 树套树 树状数组 线段树 LCA 卡常

    原文链接http://www.cnblogs.com/zhouzhendong/p/9016579.html 题目传送门 - Codechef EDGEST 题意 给定相同点集上的两棵生成树$T_1$ ...

  10. Service Fabric SfDevCluster目录从默认的C盘移动

    管理员权限打开Powershell CD\ 回车 CD "C:\Program Files\Microsoft SDKs\Service Fabric\ClusterSetup" ...