[OI] 欢夏!邪龙?马拉车!

news/2024/11/19 17:24:51/文章来源:https://www.cnblogs.com/HaneDaCafe/p/18347542

标题来自原神

算法概述

Maracher 算法

用途:寻找回文串,最板子的情况下用于字符串的回文子串计数

给定一个字符串 \(S\),求出它全部的回文子串

容易想到一种暴力的 \(n^{2}\) 做法,即枚举全部中心点,开双指针向两边扩展,每扩展一次就提供 \(1\) 的贡献.

事实上,对于这样的算法来说,判断偶回文串会不太方便:因为它没有中心点.

因此,我们考虑在原字符串里加入一些莫名其妙的字符,如下:

cthoiissb
c#t#h#o#i#i#s#s#b

这样做,我们发现,当枚举原字符串内的点作为中心点时,就相当于在枚举奇回文子串,当枚举特殊字符作为中心点时,就相当于在枚举偶回文子串. 我们通过上述方法完成了对奇偶子串的统一.

下面我们来考虑对进行的转移进行优化

首先我们引入一些概念:

定义回文半径表示回文串的长度除以二的值(显然,在处理之后,回文串全都变成了奇回文串,因此直接向下取整即可),我们这样定义是因为处理后的回文半径长等于处理前的回文串长度减一,如下:

cthtc   length=5
c#t#h#t#c length=4

类似地,我们还可以求出该回文串在原串中的位置:

oicthtc
o#i#c#t#h#t#c length=4[8]

可以发现,cthtc 的对称中心 h 在原字符串中的位置为 \(5\)(以下默认下标从 \(0\) 开始),在处理后的字符串中的位置为 \(8\),而回文半径长为 \(4\),考虑到 \(8+1-4=5\),发现再多举几组也是如此的性质,即 “原字符串位置等于处理后字符串位置加一减去回文半径”,考虑到这样有点麻烦,因此在处理后的字符串前插入一个不同的字符(也是为了防止在 \(p=0\) 时访问负数下标),实际上如果保守一点的话,末尾也是需要插入特殊字符,只不过因为末尾有一个 \0,因此不需要插入. 需要注意的是,如果真的要插入的话,首位字符不能相同,否则直接就把他们两个匹配上了,会影响答案.

到现在我们的算法还是 \(n^{2}\) 的,下面我们来考虑优化这种转移.

图源

图例中的 \(T\) 表示了一种可能的字符串,下方的每一位的 \(P\) 表示了以当前位为中心的最长回文半径. 一般来说,这个 \(P\) 数组需要我们从头到尾扫一遍来求,这一点我们无从优化,我们来考虑如何才能从之前的状态跳到当前的状态.

如图,我们已经求出了一部分 \(P\) 的值,注意到图中有一个很大的 \(P_{11}=9\),我们考虑利用一下它,因此用虚线标出它的中心与左右边界. 现在我们的目标是求出 \(P_{13}\)

假如 \(P_{11}\) 左右两边对称的话,可以想到我们只需要找到需要求的点在另一边的对称点,那么对称点的 \(P\) 值一定就也是当前点的 \(P\) 值:因为回文的性质,既然对称点是回文,对称过来也一定是回文,并且因为之前求的是最大值,因此也不存在一个更大的值了,所以直接转移即可.

下面我们再来考虑另一种情况:

现在的目标是求 \(P_{15}\),按照刚才的思路,现在我们应该去找对称点 \(P_{7}\),但是我们发现此时无法直接进行转移.

刚才我们转移是建立在一个很大的回文区间 \(P_{11}=9\) 上的,因为两边的回文区间全部都在这个大的回文区间内,因此我们才能保证两边的字符是相等的. 现在区间超出了大的对称区间的范围,因此不能保证超出范围的部分是相等的,也就不能直接转移了.

不过这样的情况还是有利用价值的,考虑可以先把能保证相等的转移了,即转移到大区间的边界,剩下的没有办法,可以直接进行暴力转移,为下一次转移助力. 可以证明这样做的复杂度是 \(O(n)\) 的.

习题

P3805 模板

To be added

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

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

相关文章

一行命令搞定内网穿透

一行命令搞定内网穿透 一款开源免费的内网穿透工具:localtunnel ,基于 nodejs 实现,无需修改 DNS 和防火墙设置,方便快捷的将内网服务暴露到外网,为开发人员、测试人员以及需要分享本地项目的人提供实时的公网访问方式,以便于测试和共享!功能特性一行命令启动,无需复杂…

中电信翼康济世数据中台基于Apache SeaTunnel构建数据集成平台经验分享

Apache SeaTunnel作为一个高效、灵活的数据集成平台,在数据中台战略中扮演着重要角色。通过本文的介绍,读者可以了解如何基于SeaTunnel快速搭建数据集成平台,并在实际应用中灵活运用。未来,随着技术的不断发展,SeaTunnel将继续在数据集成领域发挥重要作用,助力企业实现数…

数据集可以自己找开源

数据集可以自己找开源,比如GitHub上面的等等。 比如这个:https://github.com/bstabler/TransportationNetworks/tree/master其他相关项目 TRB网络建模委员会 InverseVIsTraffic是一个开源存储库,它实现了一些针对单类和多类交通网络提出的逆变分不等式 (VI) 公式。该软件包还…

js实战小项目随笔

获取事件源 var img = document.getElementById("imgs"); setAttribute为事件源赋值 img.setAttribute("src", "./image/" + index + ".jpg"); 图片切换

泛微OA移动端在公网IP变更和无法打开Install.do界面下修改插件库地址(122,128报错)

事情起因 因为公司搬迁,公网IP变更,服务器搬迁时未提前调整好泛微oa服务器的IP,但是旧地址仍留有主路由可以使用。 发现问题移动端无法正常连接,/install.do的界面也无法打开,无法进入修改插件库服务器IP的页面 联系了技术,技术表示/install.do无法打开的话也无能为力(因…

[Paper Reading] DEFORMABLE DETR: DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION

DEFORMABLE DETR: DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION link 时间:2021(ICLR) 机构:Sensetime & USTC & CUHK TL;DR 参考2D Deformable Conv,通过在Reference Point附近增加sample points,将DETR的收敛速度提升10倍,对于小目标效果也更好。 …

js学习

变量通过prompt收集输入信息声明变量特殊情况八股文字符类型可以随时变换js中数字前补0为八进制,补0x为十六进制方法:isNaN(),如果是数字返回false,反之返回true字符串转义符字符串与别的类型拼接,拼接后为字符串字符串内设置变量布尔值数据类型,true参与运算时作为1,…

QStyledItemDelegate 和QTreeView实现鼠标hover消息

1.QTreeView设置属性mousetracking和tablettracing 重写QStyledItemDelegate类,重写函数 bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index); 这个函数里可以处理鼠标hover和点击事件;bo…

c# net6 读取appsettings.json方法

如图:一、appsettings.json{"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": "*","SqlServer": {"Server":…

CSS3第二天(元素显示模式、图片背景设置)

1.元素显示模式 ①块元素 <h1>~<h6>、<p>、<div>、<ul>、<ol>、<li>等 特点: 1.独占一行 2.高、宽、外边距、内边距可控制 3.宽度默认是父级容器宽度的100% 4.里面放行内或块级元素 注意:文字类元素内不能使用块级元素 <p>、…

CSS3(元素显示模式)

1.元素显示模式 ①块元素 <h1>~<h6>、<p>、<div>、<ul>、<ol>、<li>等 特点: 1.独占一行 2.高、宽、外边距、内边距可控制 3.宽度默认是父级容器宽度的100% 4.里面放行内或块级元素 注意:文字类元素内不能使用块级元素 <p>、…

【Redis】

一、Redis概述 1. Redis简介 1.1 简介 Redis(Remote Dictionary Server)是一个开源的内存数据库,遵守 BSD 协议,它提供了一个高性能的键值(key-value)存储系统,常用于缓存、消息队列、会话存储等应用场景。性能极高:Redis 以其极高的性能而著称,能够支持每秒数十万次的…