1 条题解
-
0
ABB 题解
思路
设最终在末尾添加了 个字符。若整个结果是回文串,那么新加入的部分必须依次等于原串前 个字符的逆序。删去这两段互相对应的字符后,原串剩余的后缀必须自身是回文串。
反过来,若从位置 开始的后缀是回文串,只需在末尾补上原串前 个字符的逆序,得到的整个字符串一定是回文串。
因此,答案等于
其中 是原串最长回文后缀的长度。
子任务 1:直接检查后缀
依次枚举后缀的起点,并用双指针判断该后缀是否为回文串。第一个满足条件的起点对应最长回文后缀,也就是答案。
每次检查需要 时间,共有 个后缀,因此时间复杂度为 ,额外空间复杂度为 。该方法适用于 。
做法
满分算法:前缀函数
记 为 的逆序串,构造
其中分隔符不在小写字母表中。
计算 的前缀函数。最后一个位置的前缀函数值记为 ,它表示 的最长前缀与后缀的公共长度。由于分隔符隔开了两部分,这个公共长度不会跨过分隔符;它恰好比较 的长度为 的前缀与 的长度为 的后缀。
的这一前缀正是 对应后缀的逆序。因此两者相等,当且仅当该后缀是回文串。前缀函数取最大的可行长度,所以得到的正是最长回文后缀长度。
最终输出 。
正确性证明
引理 1:若在 末尾添加 个字符后得到回文串,则 去掉前 个字符后的后缀是回文串。
证明:最终回文串的前 个字符与后 个字符互为逆序。删去这两段后,中间剩余部分仍为回文串,而该部分正是所述后缀。
引理 2:若 去掉前 个字符后的后缀是回文串,则可以只添加 个字符使整个字符串成为回文串。
证明:在末尾添加 前 个字符的逆序。新增部分与原串前缀互相对应,中间后缀本身回文,所以整个字符串回文。
引理 3:构造串 的最后一个前缀函数值等于 的最长回文后缀长度。
证明:长度为 的匹配表示 的长度为 的前缀等于 的长度为 的后缀。前者是后者的逆序,因此匹配当且仅当该后缀回文。前缀函数选择最大的匹配长度,结论成立。
定理:算法输出的数值是使 成为回文串所需添加字符数的最小值。
证明:由引理 3,算法找到最长回文后缀长度 。由引理 2,添加 个字符一定可行;若存在更少的添加量,引理 1 将导出一个长度大于 的回文后缀,与 的最大性矛盾。因此答案最优。
复杂度分析
构造逆序串和计算前缀函数均为线性过程。时间复杂度为 ,空间复杂度为 。
独立验证
数据生成时还使用 Manacher 算法独立求出所有奇回文和偶回文半径,选取右端点为 的最长回文段。该实现与前缀函数方法的数据结构和推导路径不同,可用于交叉核对答案。
- 1
信息
- ID
- 913
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 0
- 上传者