Luogu P4287 SHOI2011 双倍回文 题解 [ 紫 ] [ manacher ]

news/2025/1/5 22:11:59/文章来源:https://www.cnblogs.com/zhr0102/p/18651247

双倍回文:回文子串结论的经典应用。

结论

先放本题最关键的结论:一个字符串本质不同的回文子串最多只有 \(n\)

考虑如何证明:

假设我们一个一个地在当前字符串(黑色部分)的结尾加入字符(红色部分),那么会出现如下情况:

显然,加入红色字符后,字符串中最多只可能新出现一个本质不同的回文子串。如果这个本质不同的回文子串存在,则这个回文子串就是当前最长的回文子串(深蓝色部分)。

为啥呢,因为假设存在一个更短的回文子串(浅蓝色部分),我们称这个浅蓝色的短回文子串为 \(s\),深蓝色的最长回文子串为 \(t\),则 \(t\) 中一定包含了 \(s\)。而根据回文串的性质,\(s\) 正着读反着读都相同,因此深蓝色的回文串 \(t\) 另一边一定存在另一个 \(s\),且那个 \(s\) 的结尾比当前 \(s\) 的结尾靠前(这两个 \(s\) 在图中用浅蓝色划出来了)。因此它已经被计入本质不同的回文子串中了。

思路

有了这个结论,剩下的就简单了,我们只需要对每个本质不同的回文串判断一下就可以了。

用 manacher 来实现,在每次扩展盒子右端点时统计新拓展部分的回文子串,注意特判细节即可。

因为右端点最多只会拓展 \(n\) 次,所以时间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define lc (p<<1)
#define rc ((p<<1)|1)
#define eb(x) emplace_back(x)
#define pb(x) push_back(x)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
using pi=pair<int,int>;
int m,n,ans=0,d[1000005];
char a[500005],s[1000005];
void init()
{n=0;s[0]='$';s[++n]='#';for(int i=1;i<=m;i++)s[++n]=a[i],s[++n]='#';s[n+1]='&';
}
void manacher()
{d[1]=1;for(int i=2,l=0,r=0;i<=n;i++){if(i<=r)d[i]=min(r-i+1,d[l+r-i]);while(s[i-d[i]]==s[i+d[i]])d[i]++;if(i+d[i]-1>r){if(s[i]=='#'){for(int j=r+1;j<=i+d[i]-1;j++){if(s[j]=='#')continue;int dxx=(j-i+1)/2,c=i-dxx;if(d[c]/2>=dxx/2&&s[c]=='#'&&dxx>=1&&dxx*2%4==0)ans=max(ans,dxx*2);}            }l=i-d[i]+1,r=i+d[i]-1;}}
}
int main()
{//freopen("sample.in","r",stdin);//freopen("sample.out","w",stdout);ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>m>>a+1;init();manacher();cout<<ans;return 0;
}

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

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

相关文章

傲梅轻松备份(系统备份还原)v7.4.1 技术师增强版

傲梅轻松备份是由傲梅官方推出的电脑上一键备份系统工具,有着业界最快的备份速度,能够瞬间将电脑上的系统备份下来,方便用户下次系统一键还原。傲梅轻松备份专业版专业解决用户的备份系统不会、磁盘备份不会、文件备份太麻烦等等各种问题,简化了整个备份的流程,加快了备份…

Python多分类Logistic回归详解与实践

在机器学习中,Logistic回归是一种基本但非常有效的分类算法。它不仅可以用于二分类问题,还可以扩展应用于多分类问题。本文将详细介绍如何使用Python实现一个多分类的Logistic回归模型,并给出详细的代码示例。在机器学习中,Logistic回归是一种基本但非常有效的分类算法。它…

【STC8H】STC8 系列单片机低功耗延时方法

STC8 单片机低功耗延时方法 单片机延时通常方法就是跑while循环,但在低功耗要求下可以利用定时唤醒方式使MCU在延时期间睡眠,降低功耗。以STC8G1K08为例: 寄存器 WKTCH^8为使能,其余15位用于控制唤醒时间。并且在唤醒后系统会继续从掉电语句的下一句执行。延时计算 按照公式…

C盘注册表优化清理工具!Wise Registry Cleaner v11.1.9.724

Wise Registry Cleaner是一款优化电脑性能的软件,通过清理注册表中的无效和过时信息来提升计算机运行速度。它能快速扫描并安全清理垃圾文件,同时优化PC。软件具备一键撤销更改和注册表备份功能,确保操作安全。最新版本改进了清理规则,增加了优化项目,并解决了特定软件兼容…

winrar(解压工具-含电脑版和手机版)

winrar,全球使用人数最多解压工具 winrar 烈火汉化无广告版(含电脑版和手机版),一款在官方原版的基础上注册破/解winrar64位去广告版,安装即可使用,不需要使用注册码及key文件,非常简单易用,欢迎有需要的朋友们前来下载使用。另:程序容易被杀毒软件误报,但亲测无毒可…

JVM实战—9.线上FGC的几种案例

大纲 1.如何优化每秒十万QPS的社交APP的JVM性能(增加S区大小 + 优化内存碎片) 2.如何对垂直电商APP后台系统的FGC进行深度优化(定制JVM参数模版) 3.不合理设置JVM参数可能导致频繁FGC(优化反射的软引用被每次YGC回收) 4.线上系统每天数十次FGC导致频繁卡顿的优化(大对象问题) 5…

Unity 中一些常见的富文本标签

Unity 支持的富文本标签主要用于在 Text 和 TextMeshPro 中格式化和控制文本的显示效果。以下是 Unity 中一些常见的富文本标签: 1. 字体样式 <b> 和 </b>: 粗体 <i> 和 </i>: 斜体 <u> 和 </u>: 下划线 <s> 和 </s>: 删除线…

WinMemoryCleaner 电脑内存清理工具

告别卡顿,让电脑飞起来! 这款免费的 RAM 清理器利用了本机 Windows 功能来清理内存区域。有时候,程序在运行结束后并不会释放分配给它的内存,这会导致计算机的性能下降。换句话说,当你使用 Windows Memory Cleaner 来优化内存时,可以继续进行其他工作,而无需浪费时间重新…

低功耗电压比较器(微功率比较器)整理

前言 传统用的电压比较器 LM393 静态工作电流太大了(0.45mA),想寻找一款低功耗的电压比较器。规格 LM393B LM2903B LM393/LM393A LM2903 LM2903V/LM2903AV LM193 LM293/LM293A 单位电源电压 2 至 36 2 至 36 2 至 30 2 至 30 2 至 32 2 至 30 2 至 30 V总电源电流 (5V 至 36…

Bandizip(跨平台解压缩软件) v7.36 激活版

虽然 7-Zip 是开源免费压缩工具中的佼佼者,但用得不是很顺手,今天试了下推荐的 Bandizip 却出人意料的好用!Bandizip 是一款来自韩国的免费优秀的文件压缩/解压缩软件,支持 Win 与 Mac,操作方式与 WinRAR 相似,支持压缩和解压 rar、zip、7z 等众多主流格式… 解压 支持的…

如何从文档创建 RAG 评估数据集

添加微信1185918903,关注公众号ChallengeHub获取更所咨询在本文中,将展示如何创建自己的 RAG 数据集,该数据集包含任何语言的文档的上下文、问题和答案。检索增强生成 (RAG) [1] 是一种允许 LLM 访问外部知识库的技术。 通过上传 PDF 文件并将其存储在矢量数据库中,我们可以…

变分推断(VI)、随机梯度变分推断(SGVI/SGVB)、变分自编码器(VAE)串讲

主要介绍了变分推断(VI)、随机梯度变分推断(SGVI/SGVB)、变分自编码器(VAE)参考资料:VI参考:PRML Chapter 10. SGVI原文:Auto-Encoding Variational Bayes -- Kingma. VAE参考1:Tutorial on Variational Autoencoders -- CARL DOERSCH. VAE参考2:Stanford University CS23…