首页 > 其他分享 >Manacher 学习笔记

Manacher 学习笔记

时间:2024-05-04 19:55:17浏览次数:18  
标签:子串 记录 一个 Manacher 笔记 学习 字符串 回文

Manacher是一个求出一个字符串中所有回文子串的利器。

记录方法

首先我们发现一个问题,一个长为 \(S\) 的字符串一共有 \(S^2\) 个子串,所以记录回文子串时不可能记录左右端点。如何解决呢?根据回文串的特点,我们发现,一个回文串,将它的两端各删去一个字符,那么它还是一个回文串。所以我们可以记录下每一个回文串的中心点以及回文串的“半径” \(a_i\) ,这样记录的问题解决了,接下来就到如何快速求解了。

过程

在Manacher中,我们需要维护一个 \(l\) 和 \(r\) ,表示当前右端点最靠右的回文串是哪个。设当前枚举到的中心点为 \(i\) ,之前的所有点的 \(a\) 已计算完毕,分两种情况讨论:

\(i>r\)

此时我们不能从前面计算到的数据求出当前点的 \(a_i\) ,只能暴力扩展半径到不能再扩展为止。

\(i\le r\)

此时我们可以从当前的这个回文串中找到 \(i\) 的对应点 \(j=l+(r-i)\) ,之后我们在大部分情况下可以将 \(a_j\) 赋值 \(a_i\)。但是考虑到可能 \(j-a_j\) 比 \(l\) 小,不能保证 \(r\) ~ \(i+a_i\) 和 \(l\) ~ \(j-a_j\) (这个是倒过来的)相同,所以在赋值时将 \(a_j\) 与 \(r-i\) 取 \(min\) ,之后再暴力扩展。

计算完一个点的 \(a\) 后,要记得更新 \(l\) 和 \(r\)。

初始值可以设为 \(l=0,r=-1\) 。

技巧

等等,上面讲的好像是只能算奇数长度的回文子串,那偶数的怎么办?

其实用上面的方法再推一推就可以找到计算偶数的方法了。但是有另一个技巧,可以在原字符串中,每两个字符中间插入一个不在原字符集中的字符(例如‘#’),这样就可以一遍算出所有的回文子串。

如果怕在枚举时边界不好控制,也可以在字符串两端加不一样的特殊字符。

标签:子串,记录,一个,Manacher,笔记,学习,字符串,回文
From: https://www.cnblogs.com/Cyanwind/p/18172620

相关文章

  • 文件包含-基于Pikachu的学习
    File_Include(文件包含)原理文件包含,是一个功能。在各种开发语言中都提供了内置的文件包含函数,其可以使开发人员在一个代码文件中直接包含(引入)另外一个代码文件。比如在PHP中,提供了:include(),include_once()require(),require_once()这些文件包含函数,这些函数在代码设计中......
  • 整体二分学习笔记
    1.简介在一些题目中,可能存在一些题目,对于每次询问直接二分可能会TLE,此时就要用到整体二分整体二分是一种离线的方法,适用于如下情况:询问答案具有可二分性修改对判定答案的贡献相互独立,修改之间互不影响效果修改如果对判定答案有贡献,则该贡献是一个确定的与判定标准无关......
  • 深入学习和理解Django视图层:处理请求与响应
    title:深入学习和理解Django视图层:处理请求与响应date:2024/5/417:47:55updated:2024/5/417:47:55categories:后端开发tags:Django请求处理响应生成模板渲染表单处理中间件异常处理第一章:Django框架概述1.1什么是Django?Django是一个高级的PythonWeb......
  • 【YoloDeployCsharp】基于.NET Framework的YOLO深度学习模型部署测试平台
    1.项目介绍  基于.NETFramework4.8开发的深度学习模型部署测试平台,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等应用场景,同时支持图像与视频检测。模型部署引擎使用的是OpenVINO™、TensorRT、ONNXruntime以及OpenCVDNN,支持CP......
  • sysbench的部分基准性能测试学习
    sysbench的部分基准性能测试学习命令Compiled-intests:fileio-FileI/Otestcpu-CPUperformancetestmemory-Memoryfunctionsspeedtestthreads-Threadssubsystemperformancetestmutex-Mutexperformancetest通用参数Generaloptions:-......
  • 狂神spring学习笔记
    1.Spring1.简介一个融合器,一个简化开发的框架spring官网github地址2.Maven坐标<!--https://mvnrepository.com/artifact/org.springframework/spring-webmvc--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc&......
  • stm32开发笔记
    GPIO全名为GeneralPurposeInputOutput,即通用输入输出。有时候简称为“IO口”。通用,说明它是常见的。输入输出,就是说既能当输入口使用,又能当输出口使用。端口,就是元器件上的一个引脚。输入模式和输出模式是GPIO的基本特性,当然GPIO还有其它模式可选。(一)模式汇总输入模式:l......
  • DSP28335学习笔记(1)
    DSP28335最小系统电源电路晶振电路作用:提供稳定的时钟晶振频率:一般为30MHz复位电路使用JTag烧录程序过程中不能复位,否则芯片可能锁死下载电路F28335启动模式存储器与寄存器F28335芯片内部的存储器包括了256K×16位的FLASH(ROM),34K×16位的SARAM,8K×16......
  • 《自动机理论、语言和计算导论》阅读笔记:p352-P401
    《自动机理论、语言和计算导论》学习第12天,p352-P401总结,总计50页。一、技术总结1.TuringMachine(TM)2.undecidability​a.Ld(thediagonalizationlanguage)3.reductionp392,Ingeneral,ifwehaveanalgorithmtoconvertinstancesofaproblemP1toi......
  • DSP28335学习笔记(2)
    实验点亮LED灯电路设计共阳极连接软件设计让F28335的GPIO68管脚输出一个低电平。使能对应IO外设时钟、配置IO功能和输出模式,上拉设置。主要程序://LED初始化函数voidLED_Init(void){EALLOW;//关闭写保护SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK......