洛谷 P3805:【模板】manacher ← 最长回文串
📅 2026/7/26 18:29:48
👁️ 次浏览
【题目来源】https://www.luogu.com.cn/problem/P3805https://www.acwing.com/problem/content/3190/【题目描述】给出一个只由小写英文字符 a, b, c, ..., y, z 组成的字符串 S求 S 中最长回文串的长度。字符串长度为 n。【输入格式】一行小写英文字符 a, b, c, ..., y, z 组成的字符串 S。【输出格式】一个整数表示答案。【输入样例】aaa【输出样例】3【算法分析】Manacher 算法谐称马拉车算法是用于在O(n)时间复杂度内找到字符串中最长回文子串的高效算法。核心内容如下。备注此图由豆包 AI 创作生成★ 基于原字符串 a 生成由特殊字符分割的字符串 b方法在原字符串 a 的首尾及每两个相邻字符间插入未在原串中出现的字符作为分隔符。分隔符的选择依据是其未在原串中出现通常可以选择#号。如果原字符串中有 # 号就需要插入其他未在原串中出现的分隔符。此外为了避免在搜索回文子串时总是判断是否越界通常在原字符串 a 的首端加 $ 号在尾端加 ^ 号等原串中未出现的特殊字符。void init() { int k0; b[k]$, b[k]#; for(int i0; in; i) b[k]a[i],b[k]#; b[k]^; nk; }例如若原字符串为“google”那么插入分隔符 # 及 $、^ 之后变为了“$#g#o#o#g#l#e#^”。意义在设计 Manacher 算法时可以统一考虑为作用于包含奇数个字符的字符串。这是因为不论原字符串 a 中包含奇数个字符还是偶数个字符其插入的分隔符的个数如 # 号的个数一定等于原字符串 a 中的字符个数1。因此若原字符串 a 包含奇数个字符则插入分隔符 # 后所得的字符串 b 中的字符个数为“奇数偶数奇数”。若原字符串 a 包含偶数个字符则插入分隔符 # 后所得的字符串 b 中的字符个数为“偶数奇数奇数”。例如aba--#a#b#a#长度是7、abba--#a#b#b#a#长度是9。之后首尾再加上 $、^ 两个字符后生成的字符串 b 中的字符个数仍然为奇数。换种说法即这样处理后使得原串 a 中的任意回文串在 b 串中都表示为奇数长度串的形式且都有一个中心点。★ Manacher 算法主要内容解析设p[i]表示以字符串第 i 位为中心的回文串的最大半径即回文半径。由下图易知原字符串 a 中回文串的长度就是添加特殊字符 # 之后的字符串 b 的回文半径 -1。设mr为之前得到的最长回文子串的右端点位置的最大值并且设取得这个最大值的回文子串的中心位置为 mid分两种情况讨论第一种情况imr如果 imr说明以 i 为中心的回文串还没有进行匹配。此时置 p[i]1然后开始匹配匹配完成后更新 mr 和对应的 mid 以及 p[i]。第二种情况imr1p[i]mr−i下图中 2*mid-mr 是 mr 关于 mid 的对称点j 是 i 关于 mid 的对称点可知j 2*mid - i。且据 p[i]mr−i 可知 i 的回文区域i 附近的黄色区域部分位于之前求得的mid 的回文区域[2*mid-mr, mr]的内部为了满足回文串的对称性故其必与已经求得的 j 的回文区域j 附近的黄色区域部分相同且关于 mid 对称此时p[i]p[j]p[2*mid-i]。2p[i]mr−i由对称性说明以 i 为中心的回文串可能会延伸到 mr 之外。而大于 mr 的部分还没有进行匹配所以要从mr1位置开始一个一个进行匹配直到发生失配。然后更新 mr 和对应的 mid 以及 p[i]。此时p[i]mr-i。所以在imr的条件下p[i]min(p[midmid-i],mr-i)。综上可得求 p[i] 的核心代码如下所示。if(imr) p[i]min(p[midmid-i],mr-i); else p[i]1;★ 为啥用if(imr) p[i]min(p[midmid-i],mr-i);取最小值而不是取最大值p[i] min(...)的意义是在已知信息下这个赋值给出了 p[i]的一个安全下界——即 p[i]至少有多大但可能更大。取最小值是为了保证这个初始值不超出已验证区域后续再用 while 循环暴力扩展探索真正的边界。【算法代码】#include bits/stdc.h using namespace std; const int maxn2e75; char a[maxn],b[maxn]; int p[maxn]; int n; void init() { int k0; b[k]$, b[k]#; for(int i0; in; i) b[k]a[i],b[k]#; b[k]^; nk; } void manacher() { int mr0; int mid0; for(int i0; in; i) { if(imr) p[i]min(p[midmid-i],mr-i); else p[i]1; while(b[i-p[i]]b[ip[i]]) p[i]; if(ip[i]mr) { mrip[i]; midi; } } } int main() { cina; //scanf(%s, a); nstrlen(a); init(); manacher(); int ans0; for(int i0; in; i) ansmax(ans,p[i]-1); coutansendl; return 0; } /* in: abcbabcbabcba out: 13 */【参考文献】https://blog.csdn.net/hnjzsyjyj/article/details/142873220https://www.acwing.com/file_system/file/content/whole/index/content/9348088/https://www.cnblogs.com/cloudplankroader/p/10988844.htmlhttps://www.acwing.com/solution/content/66912/
Adobe Illustrator自动化脚本:设计师告别重复劳动的7个秘密武器 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts
还在为Illustrator中的重复操作烦恼吗?每天花…
📅 2026/7/26 18:29:48
内容:上周三下午三点,我盯着电脑屏幕上的那个报错代码发呆,心里那股火蹭蹭往上冒。项目眼看就要交付,客户那边催得紧,结果服务器突然抽风,日志里全是乱码,最后定格在几个让我头大的字符上。说实话,当时我脑子一片空白,第一反应是去翻官方文档,结果那文档写得跟天书似的…
📅 2026/7/26 18:28:18
索尼相机深度解锁指南:用OpenMemories-Tweak释放你的摄影潜能 【免费下载链接】OpenMemories-Tweak Unlock your Sony cameras settings 项目地址: https://gitcode.com/gh_mirrors/op/OpenMemories-Tweak
你是否曾为索尼相机的官方限制而烦恼?30…
📅 2026/7/26 18:28:48
说实话,刚听到 geo10x 这词儿的时候,我也愣了一下。啥玩意儿?听着像是什么高科技的黑话,或者是哪个硅谷大佬搞出来的新名词。但当你真正沉下心来去琢磨它背后的逻辑,你会发现,这玩意儿其实特别接地气,甚至有点“土”,但土得有理,土得让人信服。咱们先聊聊现状。现在的…
📅 2026/7/27 3:21:57
在日常开发工作中,我们经常需要处理各种复杂的交互场景,特别是当涉及到用户界面操作记录与分析时。最近,一项名为 Photon-1 的技术引起了广泛关注,它通过分析屏幕录像数据来学习并理解计算机操作行为。本文将深入探讨这一技术的实…
📅 2026/7/27 3:22:17
为何大家对 git rebase -i 充满恐惧?2026 年 7 月 14 日,初级开发者职业生涯早期,很多人会震惊于大家对 git rebase -i 这个命令充满恐惧。即便一些在很多方面比作者聪明得多的同事,也似乎害怕使用这个命令。git rebase -i 实际有…
📅 2026/7/27 3:22:17
1. Android动画实战概述在移动应用开发领域,动画效果已经成为提升用户体验的关键因素。作为一名有五年Android开发经验的工程师,我深刻体会到优秀的动画设计能让应用从"能用"变为"好用"。根据Google Play Store的统计数据显示&#…
📅 2026/7/27 3:22:17
1. 项目概述:ROS运动控制的核心价值在机器人开发领域,运动控制是连接上层决策与底层硬件的桥梁,是让机器人“动起来”的灵魂。无论是机械臂的精准抓取、移动机器人的自主导航,还是无人机在空中的稳定悬停,其背后都离不…
📅 2026/7/27 3:22:17
1. 项目概述:深入理解SM320F28335-EP的SPI与Flash时序在嵌入式系统开发,尤其是工业控制、电机驱动和数字电源这类对实时性和可靠性要求极高的领域,处理器与外设之间的通信时序以及非易失性存储器的访问性能,往往是决定系统成败的关…
📅 2026/7/27 3:22:17
现象在 WezTerm 终端中,包含中文路径的文本(如标签页标题、Shell 提示符、路径补全)中,某些汉字时而渲染为日文字形,时而显示为简体中文(中国大陆)字形。以「径」字为例,日文写法右侧…
📅 2026/7/27 0:00:07
这个问题看似在寻找一个答案,实际上是在寻找一种“值得继续投入的方向感”。很多人在问:
“人生有什么意义?”
深层可能是在问:
我现在做的事情值得吗?我的努力有没有价值?我的存在是不是重要?未…
📅 2026/7/27 0:00:07
1. 为什么MoE架构让大模型参数量翻倍却不增加推理成本?去年我在部署一个千亿参数大语言模型时,首次接触到混合专家模型(Mixture of Experts,简称MoE)架构。当时最让我震惊的是,这种架构的模型参数量可以达到…
📅 2026/7/27 0:00:07
更多请点击:
https://codechina.net
第一章:AI帮助理解数学概念 人工智能正以前所未有的方式重塑数学学习的路径。通过自然语言处理与符号计算的深度融合,AI不仅能解析抽象定义,还能将定理、证明和几何直觉转化为可交互、可验证的…
📅 2026/7/27 1:11:21
1. 项目背景与核心价值去年参与的一个短剧项目让我深刻体会到传统创作流程的痛点:编剧团队花了三周打磨剧本,角色设计反复修改了七版,最后成片时又因为演员档期问题不得不临时调整分镜。这种低效的创作模式在快节奏的内容行业越来越难以为继。…
📅 2026/7/27 1:11:21
remix-i18next TypeScript类型安全实践:确保翻译键与类型定义同步 【免费下载链接】remix-i18next The easiest way to translate your React Router framework mode apps 项目地址: https://gitcode.com/gh_mirrors/re/remix-i18next
在开发多语言应用时&am…
📅 2026/7/27 1:11:21
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/26 7:10:22
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/26 17:10:53
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/26 5:10:17