回文树
1|0概念
回文树可以用来处理一个字符串中所有的回文子串。一个串的本质不同回文子串个数最多为 个。
一个字符串的回文树由两棵树组成,一个维护所有长度为奇数的回文子串,一个维护所有长度为偶数的回文子串。树上除根节点外的每个节点都表示串中的一个回文子串。
节点对应的回文子串长度。
指向该节点所对应的回文子串的最长回文后缀所对应的节点。
转移到该树的另一个节点,转移为向当前回文子串两端加上一个字符。
为方便处理,偶树的根的 设为 , 设为奇树的根,奇树的根的 设为 , 设为其本身。
构造时用增量法即可。
建 树:
2|0应用
一个字符串的本质不同回文子串个数即为其回文树除了两个根的节点个数。
字符串中一个位置的回文后缀个数即为该位置对应的节点的 链长度。
在维护每个本质不同回文子串的出现次数时,还需在 树上用儿子来更新父亲。
有时还需用到 ,指向长度小于等于其回文子串长度一半的最长回文后缀的节点,建树时维护即可。
3|0最小回文划分
给定一个字符串 ,求最小的 ,使 划分为 段,且每段 都为回文串。
考虑 ,设 为考虑了 这一段的最小划分,得:
其中合法的转移为 为回文串。
因为回文子串的个数是 的,所以不能直接做,要考虑优化。
性质: 的所有回文后缀按长度排序后,可以划分为 段等差数列。
因为若不等差时,回文串长度至少缩小为原先的一半。
节点 和 所对应的回文串的长度差。
节点 沿 向上第一个节点 的 ,其中 满足 ,即 所在的等差数列中回文串长度最小的节点的 。
所在的一段等差数列中 之和,且 为该等差数列中最长的回文串, 为当前枚举到的位置,即:
如图, 为橙色位置的 之和, 为蓝色位置的 之和, 比 多的位置是 ,更新完 后,用 更新 即可。
所示代码为求回文划分方案数。
复杂度为 。
__EOF__

本文链接:https://www.cnblogs.com/lhm-/p/13293090.html
关于博主:sjzez 的一名 OI 学生
版权声明:转载标明出处
声援博主:希望得到宝贵的建议
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现