P3649 [APIO2014] 回文串
题目链接
P3649 [APIO2014] 回文串
[APIO2014] 回文串
题目描述
给你一个由小写拉丁字母组成的字符串 。我们定义 的一个子串的存在值为这个子串在 中出现的次数乘以这个子串的长度。
对于给你的这个字符串 ,求所有回文子串中的最大存在值。
输入格式
一行,一个由小写拉丁字母(a~z)组成的非空字符串 。
输出格式
输出一个整数,表示所有回文子串中的最大存在值。
样例 #1
样例输入 #1
样例输出 #1
样例 #2
样例输入 #2
样例输出 #2
提示
【样例解释1】
用 表示字符串 的长度。
一个字符串 的子串是一个非空字符串 ,其中 。每个字符串都是自己的子串。
一个字符串被称作回文串当且仅当这个字符串从左往右读和从右往左读都是相同的。
这个样例中,有 个回文子串 a,b,c,aba,aca,bacab,abacaba。他们的存在值分别为 。
所以回文子串中最大的存在值为 。
第一个子任务共 8 分,满足 。
第二个子任务共 15 分,满足 。
第三个子任务共 24 分,满足 。
第四个子任务共 26 分,满足 。
第五个子任务共 27 分,满足 。
解题思路
回文树
回文树即回文自动机,类似于后缀自动机,具有转移边和后缀链,转移边按字符左右扩展,即在当前回文子串的基础上向左右各扩展一个一样的字符,后缀链即为当前回文子串的不包括本身的最长后缀回文子串,注意,回文串分为奇数和偶数,故需要建立两个根,奇根通过转移边连向所有长度为奇数的回文子串表示的状态节点,偶根通过转移边连向所有长度为偶数的回文子串表示的状态节点,一开始,偶根长度为 ,奇根长度为 ,因为长度每次通过转移边转移时其长度都要增加 ,另外偶根的后缀链要连向奇根,不妨这样理解:一个偶数的回文子串的长度的后缀链连向的节点表示的回文子串的长度至少要减少 ,而偶根表示的是一个空串,其后缀链至少应该连向长度为 的回文子串表示的节点,即奇根。这样除了奇根,所有的节点有且仅有一条后缀链,即回文自动机本身也是由转移边形成的 DAG 和后缀链形成的树组成。类似于后缀自动机,采取增量构造的方式,假设当前已经构造好了 个字符的回文自动机,现在向回文自动机增加一个 的字符,从上一个字符结尾的最长回文子串的节点开始,不断沿着后缀链走,直到 ,即在此回文子串的前面有一个字符 ,这样在该字符左右添加 这个字符即为 这个位置结尾的最长回文子串,如下:
此时找到了 A
这个结束状态的子串,如果 XAX
不存在回文自动机中的话再建立该字串表示的状态节点,现在的问题在于该状态节点的后缀链该如何指向,即对于 A
这个状态节点来说,由于后缀链指向的节点不能指向自己,即开始 A
应该先走向其后缀链表示的节点,然后再沿着后缀链走,直到该状态节点表示的回文子串的前面一个字符为 X
,此时在该回文子串上通过转移边 X
即得 XBX
,即为 XAX
这个回文子串表示的状态节点得后缀链指向的状态节点
另外,需要注意的一点,对于一个字符串 而言,其本质不同的回文子串最多只有 个,证明略
本题要求某个回文子串的出现次数乘以其长度的最大值,主要难点在于统计回文子串的出现次数上,类似于后缀自动机,即由于 DAG 本身就是一个拓扑图,因为通过反向转移边,长度长的回文子串一定包含长度短的回文子串,故从后往前递推统计即可
- 时间复杂度:
代码
__EOF__

本文链接:https://www.cnblogs.com/zyyun/p/16978052.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战