Manacher 算法学习笔记

news/2025/2/28 16:29:37/文章来源:https://www.cnblogs.com/sslbj/p/18743522

Manacher 马拉车算法

一、概述与定义

  • 马拉车算法是一种用来解决最长回文串等关于回文串长度问题的算法。

  • 定义一个长度为奇数 \(x\) 回文串 \(s\) 的回文中心为 \(\dfrac{x+1}{2}\)

  • 在此定义下,一个有回文中心的回文串必然是一个奇数。

  • 定义一个长度为 \(n\) 的回文串 \(s\) 的回文长度为 \(\lceil \dfrac{x}{2} \rceil\)

二、做法

  • 以字符串 \(s=\mathtt{dcbababcd}\) 为例

  • 我们首先在字符串 \(s\) 的字符之间插入一个特殊字符 \(\mathtt{\#}\),变成:

    \[s=\mathtt{\# d \# c \# b \# a \# b \# a \# b \# c \# d \#} \]

  • 这么做的目的就是消除奇数长度字符串和偶数长度字符串的长度差别。可以观察到,一个以 \(\mathtt{\#}\) 为中心的回文串去掉 \(\mathtt{\#}\) 后就是一个偶数长度字符串,一个以字母为中心的字符串就是一个奇数长度字符串。不妨定义 \(p_i\) 为以 \(i\) 为回文中心的最长回文串的回文长度,那么 \(p_i-1\) 就是一个回文串的长度(具体是哪个回文串写出来会比较抽象,这里简略)。

  • 我们再在首尾两端插入一个特殊字符串,以防止遍历的时候越界。定义刚刚没有插的时候的那一段字符串为有效段。

  • 不妨假设 \(1\)\(i-1\) 这一段中,末尾位置最后的回文串的末尾位置为 \(mx\),它是一个以 \(c\) 为中心的回文串,

  • 对于 \(i > mx\) 的情况,由于前面关于字符串的信息最多到 \(mx\),那么你木得任何办法,只能设置 \(p_i=1\),然后首尾扩展。

  • 对于 \(i \le mx\) 的情况,不妨假设 \(i\) 关于 \(c\) 的对称点为 \(j=2c-i\),注意到,一个以 \(i\) 为回文中心的回文串经过 \(c\) 对称后必然也会存在一个以其对称点 \(j\) 为回文中心的回文串,原因就是以 \(i\) 为回文中心的回文串对称后反了过来,变成了倒序,但依然是一个回文串。

  • 显然,如果 \(p_j\) 超过了 \(mx-i\),说明以 \(j\) 为中心的字符串长度超过了 \(c\) 的“对称管辖范围”,是否对称还说不定。那么我们的信息最多也就到 \(mx-i\) 这里,剩下的只能靠暴力拓展了。而如果没超过,那半点问题都没有。

  • 所以我们实现时可以这样

    • 如果 \(i>mx\),那么 \(p_i = 1\),否则 \(p_i=\max(p_{2c-i},mx-i)\)
    • 暴力拓展:当 \(s_{i-p_i} = s_{i+p_i}\) 时,\(p_i\) 加上 \(1\)
    • 更新 \(mx\),如果 \(i+p_i\) 大于 \(mx\),那么 \(mx=i+p_i\)\(c=i\)​。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/891215.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

容斥、反演、卷积与高维前缀和

数学的大网磅礴地展开了。容斥、反演、卷积与高维前缀和 StreamDraft我觉得,我们最开始使用的时候,肯定是从最普通基础的容斥原理讲起的,因为这就是我们实际遇到的一种问题:问题 1 通过集合交求集合并 假设班里有 \(10\) 个学生喜欢数学,\(15\) 个学生喜欢语文,\(21\) 个…

win10 安装 达梦数据库客户端管理程序

下载地址: https://www.dameng.com/list_103.html 选择cpu和操作系统 下载前要登录,你就登录一下就可以了。 下载的文件为:dotnet-sdk-3.1.426-win-x86.zip 解析后现将dm8_20250122_x86_win_64.iso解压,运行Setup.exe 只安装客户端,把服务器这儿去勾

Pcigo 图片名字修改插件- rename-file

picgo-plugin-rename-file A PicGo plugin for customizing file name. 可以很自定义生成文件存储路径的插件,文件(包括路径)名称支持日期、随机字符串、文件MD5、原文件名、原文件目录结构等规则。 更多需求,欢迎PR或提ISSUE。例如 2020/07/24/674b96a992fac527a8332ac4adc8…

ln -s(软链接)命令的使用

ln -s /A /B 创建软链接A指向B,Linux的软链接类似于window的快捷方式 当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的 目录下用ln命令链接(link)它就可以,不必重复…

NFSP

NSFP算法 论文名称:《Deep Reinforcement Learning from Self-Play in Imperfect-Information Games》 这是一篇博弈论和强化学习交叉的文章,网上的资料比较少,但是确实是对手建模的重要算法之一。虽然后面的PSRO算法指出NFSP是PSRO的一个特例,但是个人觉得还是很有学习的必…

车载高性能计算平台HPC2.5

经纬恒润新一代高性能计算平台HPC产品选用TI TDA4及Infineon TC397两款高性能芯片,搭载Linux及RTOS两种操作系统,集成AutoSAR及自研应用框架(AF)两类中间件,可满足复杂运算、高实时等不同应用程序的需求。 高性能计算平台(HPC)是新一代智能汽车的核心技术,是支撑“…

FANUC法那科机器人保养的要点

每一台机器人均不可或缺地需要进行预防性保养,这是确保其于生产线上持续展现最佳性能与实现高度一致性的基石。若忽视了定期对机器人进行预防性保养检查,很可能会导致其零部件遭受损坏或突发故障,进而引发生产效率的减缓,乃至生产线的全面停机。恰当的保养措施,不仅能够显…

redis bind protected-mode

概要redis bind、protected-mode 配置 安装并启动 yum install -y redis systemctl enable --now redis # 使用 redis-server 命令会在前台启动运行,可以跟个 .conf 文件 根据配置文件启动修改配置文件 # 直接编辑配置文件 (本篇文章使用此方法) vi /etc/redis.conf# 同时redis…

看中国版“ADP”如何助力泰森等在华外企应对薪酬管理挑战

“工欲善其事,必先利其器”,用软件实现复杂经营环境下的薪酬管理提效提质,是包括外企在内所有企业释放人力价值、迈向精细化管理的重要手段;也是实现薪酬价值最大化,打造经营韧性、驱动增长的必经之路。调查表明,在全球化的浪潮中,71% 的企业将人力资源相关问题视为国际…

day08 作业

day08 作业 1.使用linux实现命令别名,实现如下效果,思考,如何生成la命令。 [root@yuanlai-0224 ~]# la /var/log/ total 1.9M drwxr-xr-x. 6 root root 4.0K Mar 6 03:33 . drwxr-xr-x. 19 root root 267 Feb 26 03:27 .. drwxr-xr-x. 2 root root 204 Feb 26 03:01 an…

ABP更换MySql数据库

原因:ABP默认使用的数据库是sqlServer,本地没有安装sqlServer,安装的是mysql,需要更换数据库 ABP版本:9.0 此处以官网TodoApp项目为例打开EntityFrameworkCore程序集,可以看到默认使用的是sqlServer,此处截图为已安装mysql依赖包步骤一、安装mysql依赖包 https://abp.io…

SimpleCalculator缺陷分析与二次开发

C语言计算器项目: 项目名称:Simple Calculator GitHub 地址: https://github.com/example/simple-calculator 项目简介 这是一个命令行计算器,支持加、减、乘、除运算。 代码结构简单,适合初学者阅读和修改。 主要功能 支持加、减、乘、除运算。 通过命令行交互输入运算符和数…