[字符串算法]Manacher
1.前置知识
回文子串 回文的子串
最长回文子串 字符串中最长的回文子串
回文半径 设以\(i\)为中心的最大回文子串的长度为\(n\),则这个字符串第\(i\)位的回文半径为\((n+1)/2\)
2.算法流程
2.1 预处理
在处理回文子串(马拉车算法适用)的问题时,一般需要求出每一位的回文半径
经常做字符串题目的同学都知道,在处理这种问题时,最大的阻碍一般就是字符串长度的奇偶性以及边界
不难想到,我们可以在字符串的首尾分别插入一个字符来解决边界问题
也不难想到,我们可以在每一个字符的首尾都添加一个字符(包括第\(1\)个和最后一个)
由此,我们可以得到一个新字符串。
这里举一个例子,
原字符串s:ababa
进行完操作1(首尾标记)的字符串 s1: @ababa@
进行完操作2(字符插入)的字符串 s2: @#a#b#a#b#a#@
根据流程不难得出代码:
cin>>a;//原串
int len=strlen(a);
int k=0;
s[0]='$';
s[1]='#';
k++;
for(int i=0;i<=len;i++)
{
s[++k]=a[i];
s[++k]='#';
}
n=k;
是的是的我懂 你们想要照搬 但是看到我那不顺眼的++k急了
这个千万不能改,是先自增在标记!!
2.2 加速盒子(核心部分)
我超,盒!
是的是的学过扩展KMP算法的同学们应该都熟悉的乐子东西
所以接下来就让我演示一下这东西
本质上是一个分类讨论 分三种情况:
2.2.1 在盒内(整体)
如图,

蓝色段全体在盒子内,这个时候直接用对称点的就可以了
举例:

所以这是显而易见的
2.2.2 在盒内(部分)
如图,

蓝色段有一部分出去了,所以从\(r\)开始暴力
2.2.3 在盒外(全部)
不配图了,这个是显而易见的,两端都不在盒子内,因此只能暴力求解
2.2.4 更新(upd)
求出\(d[i]\)后,如果右端有最大值,那么更新盒位置
2.2.5 代码
依次逻辑则可以写出代码
int manacher(char s[],int n)
{
d[1]=1;
for(int i=2,l,r=1;i<=n;i++)
{
if(l<=r)
{
d[i]=min(d[r-i+l],r-i+1);
}
while(s[i-d[i]]==s[i+d[i]])
{
d[i]++;
}
if(i+d[i]-1>r)
{
l=i-d[i]+1;
r=i+d[i]-1;
}
}
}
3.例题
终于学完了
例题可以尝试去做一下A. 【例题1】不交回文串
提示:前缀和+Manacher
这里就不放代码了,自己回家好好思考一下
拜!
[字符串算法]Manacher的更多相关文章
- ACM -- 算法小结(八)字符串算法之Manacher算法
字符串算法 -- Manacher算法 首先介绍基础入门知识,以下这部分来着一贴吧,由于是很久之前看的,最近才整理一下,发现没有保存链接,请原创楼主见谅. //首先:大家都知道什么叫回文串吧,这个算法 ...
- 【字符串算法2】浅谈Manacher算法
[字符串算法1] 字符串Hash(优雅的暴力) [字符串算法2]Manacher算法 [字符串算法3]KMP算法 这里将讲述 字符串算法2:Manacher算法 问题:给出字符串S(限制见后)求出最 ...
- 【字符串算法1】 再谈字符串Hash(优雅的暴力)
[字符串算法1] 字符串Hash(优雅的暴力) [字符串算法2]Manacher算法 [字符串算法3]KMP算法 这里将讲述 [字符串算法1] 字符串Hash 老版原文: RK哈希(Rabin_Ka ...
- 【字符串算法3】浅谈KMP算法
[字符串算法1] 字符串Hash(优雅的暴力) [字符串算法2]Manacher算法 [字符串算法3]KMP算法 这里将讲述 [字符串算法3]KMP算法 Part1 理解KMP的精髓和思想 其实KM ...
- 经典算法 Manacher算法详解
内容: 1.原始问题 =>O(N^2) 2.Manacher算法 =>O(N) 1.原始问题 Manacher算法是由题目“求字符串中长回文子串的长度”而来.比如 abcdcb 的 ...
- 浅谈算法——Manacher
字符串算法在各大高级比赛中均有用到,所以,学习好字符串算法对我们而言十分重要.那么,今天我们就给大家介绍一个快速求回文串的算法,Manacher算法,我们也习惯性叫它马拉车算法. 一.引入 首先我们要 ...
- boost字符串算法
boost::algorithm简介 2007-12-08 16:59 boost::algorithm提供了很多字符串算法,包括: 大小写转换: 去除无效字符: 谓词: 查找: 删除/替换: 切割: ...
- 字符串算法之 AC自己主动机
近期一直在学习字符串之类的算法,感觉BF算法,尽管非常easy理解,可是easy超时,全部就想学习其它的一些字符串算法来提高一下,近期学习了一下AC自己主动机.尽管感觉有所收获,可是还是有些朦胧的感觉 ...
- 【字符串】manacher算法
Definition 定义一个回文串为从字符串两侧向中心扫描时,左右指针指向得字符始终相同的字符串. 使用manacher算法可以在线性时间内求解出一个字符串的最长回文子串. Solution 考虑回 ...
- 【字符串】 manacher算法
Algorithm Task 给定一个字符串,求其最长回文子串 Limitations 要求时空复杂度均为线性且与字符集大小无关. Solution 考虑枚举回文串的对称轴,将其对应的最长回文子串长度 ...
随机推荐
- net core mvc6使用jwt实现简单的登录
创建一个新的.NET Core Web应用程序项目.在创建项目时,选择MVC模板. 在项目中添加Microsoft.AspNetCore.Authentication.JwtBearer包: 在Vis ...
- TVM 安卓环境搭建部署
安装VULKAN 参考:https://blog.csdn.net/luolinll1212/article/details/113261022 在编译TVM,当config.cmake中将USE_V ...
- JavaScript入门笔记day1
文章目录 啥是JavaScript JavaScript与HTML的结合方式 js文件在HTML中的位置 注释方式 变量 命名规范: 定义的关键字 To be a struggling Rick fo ...
- IDEA如何增加界面对比度
这个问题困扰大家许久了应该,今天就让我来终结吧! 背景的对比度虽然没法直接修改,但是我们可以直接改背景色进而达到修改对比度的效果! Editor--color Scheme--general--Tex ...
- 电梯题目集总结性Blog
一.前言 对这三次题目集的总结: 这三次作业的难度是层层递进的.题目数量安排得当,给的时间也足够用.前面的基础题像搭积木一样,带着我们一步步熟悉怎么设计类和对象:但每次的最后一题就像突然升级的关卡 ...
- Serial-Studio 上位机编译全过程深度讲解,解决串口数据可视化工具
Windows环境下编译Serial-Studio Serial-Studio是一个开源的串口数据可视化工具,广泛应用于物联网.嵌入式系统调试和数据分析等领域.从源代码编译Serial-Studio可 ...
- 深入理解Nginx-模块开发与架构解析(第2版)流程梳理
1.Nginx HTTP模块调用的简化流程 Nginx HTTP模块调用的简化流程图如上: 1.worker进程会循环调用事件模块检测网络事件 2. 当事件模块检测到客户端发起TCP请求时,即收到SY ...
- Hyperledger Fabric2.x基本概念之(一)交易和区块链
▲ 点击101链视界,关注不走丢 大家好,我是阿创,这是我的第30篇原创文章. 我比较爱看书,2021年全年我的阅读量大概是20+本书,涵盖法律.哲学.技术.人文. 但是阅读量一上来反而会觉得,单纯的 ...
- 「Note」树论方向
1. 重链剖分 1.1. 简介 重链剖分将树分割成若干链维护信息,将树的结构转换为线性结构,然后可用其他数据结构维护. 定义以下概念: 重子节点 轻子节点 重边 轻边 重链 某节点的子节点中子树大小最 ...
- 微服务架构学习与思考(16):SOA架构与微服务架构对比分析?它们之间区别是什么?
什么是 SOA 架构 SOA(Service-Oriented Architecture) 架构是面向服务的架构,是一种将单体应用粗粒度的划分为服务的架构,其核心是将业务功能抽象为独立.可重用.松耦合 ...