1 条题解
-
0
解题思路
我们需要找到最长的扭动回文串,它可以是:
- 纯 中的回文子串;
- 纯 中的回文子串;
- 由 和 拼接而成的回文串 ,其中:
- 与 拼接后是回文串;
- 注意 和 在位置 处重叠( 和 是同一个下标的不同字符串的字符)。
关键点
对于情况 3,扭动回文串 的形式是:
A[i] ... A[j] B[j] ... B[k]并且整个字符串是回文的。
由于回文串对称,我们可以枚举中心点,然后向两边扩展。
但这里中心点可能落在 或 中,也可能落在 和 的拼接处。
方法
-
预处理
使用 Manacher 算法分别求出 和 中每个位置作为中心时的最长回文半径(包括奇偶长度统一处理)。 -
枚举分割点
对于情况 3,我们枚举 (),表示 的子串以 结尾, 的子串以 开头。
我们要求:- 与 拼接后是回文串;
- 并且 是 的一个回文后缀, 是 的一个回文前缀。
可以这样考虑:
- 固定 ,让 中 往左的回文半径和 中 往右的回文半径尽可能长,然后尝试拼接。
- 但拼接后可能还可以继续向 的左边和 的右边扩展(因为 的左部分和 的右部分可以继续匹配)。
-
二分 + 哈希
可以用二分法检查在 处, 往左和 往右能匹配多长(即 的某个后缀与 的某个前缀的逆序匹配)。
这样,对于每个 ,我们可以得到最长的扭动回文串长度。 -
合并答案
取三种情况的最大值。
算法复杂度
- Manacher:
- 二分 + 哈希:
- 总体:。
说明
- Manacher 用于快速求出每个位置为中心的最长回文半径。
- 哈希 用于快速比较子串是否相等(正向与反向)。
- 二分 用于确定在位置 处 和 能匹配的最大长度。
- 最终答案取三种情况的最大值。
- 1
信息
- ID
- 4778
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者