1 条题解

  • 0
    @ 2025-10-30 16:33:55

    解题思路

    我们需要找到最长的扭动回文串,它可以是:

    1. AA 中的回文子串
    2. BB 中的回文子串
    3. AABB 拼接而成的回文串 S(i,j,k)S(i,j,k),其中:
      • A[i..j]A[i..j]B[j..k]B[j..k] 拼接后是回文串;
      • 注意 AABB 在位置 jj 处重叠(AjA_jBjB_j 是同一个下标的不同字符串的字符)。

    关键点

    对于情况 3,扭动回文串 S(i,j,k)S(i,j,k) 的形式是:

    A[i] ... A[j]  B[j] ... B[k]
    

    并且整个字符串是回文的。

    由于回文串对称,我们可以枚举中心点,然后向两边扩展。
    但这里中心点可能落在 AABB 中,也可能落在 AABB 的拼接处。


    方法

    1. 预处理
      使用 Manacher 算法分别求出 AABB 中每个位置作为中心时的最长回文半径(包括奇偶长度统一处理)。

    2. 枚举分割点
      对于情况 3,我们枚举 jj1jN1 \leq j \leq N),表示 AA 的子串以 jj 结尾,BB 的子串以 jj 开头。
      我们要求:

      • A[i..j]A[i..j]B[j..k]B[j..k] 拼接后是回文串;
      • 并且 A[i..j]A[i..j]AA 的一个回文后缀,B[j..k]B[j..k]BB 的一个回文前缀。

      可以这样考虑:

      • 固定 jj,让 AAjj 往左的回文半径和 BBjj 往右的回文半径尽可能长,然后尝试拼接。
      • 但拼接后可能还可以继续向 AA 的左边和 BB 的右边扩展(因为 AA 的左部分和 BB 的右部分可以继续匹配)。
    3. 二分 + 哈希
      可以用二分法检查在 jj 处,AA 往左和 BB 往右能匹配多长(即 AA 的某个后缀与 BB 的某个前缀的逆序匹配)。
      这样,对于每个 jj,我们可以得到最长的扭动回文串长度。

    4. 合并答案
      取三种情况的最大值。


    算法复杂度

    • Manacher:O(N)O(N)
    • 二分 + 哈希:O(NlogN)O(N \log N)
    • 总体:O(NlogN)O(N \log N)

    说明

    • Manacher 用于快速求出每个位置为中心的最长回文半径。
    • 哈希 用于快速比较子串是否相等(正向与反向)。
    • 二分 用于确定在位置 jjAABB 能匹配的最大长度。
    • 最终答案取三种情况的最大值。
    • 1

    信息

    ID
    4778
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者