1 条题解

  • 0
    @ 2025-10-23 12:53:47

    核心思路

    本题要求将字符串分割成若干区间,每个区间可以重排成回文串,且最短区间长度尽可能大

    1. 回文串的字母重排条件

    一个区间可以重排成回文串的充要条件是:

    • 区间内最多只有一个字母出现奇数次

    2. 奇偶性状态表示

    使用26位二进制数表示字母出现次数的奇偶性:

    • kk 位为 11 表示字母 'a'+k 出现奇数次
    • kk 位为 00 表示字母 'a'+k 出现偶数次

    pref[i]pref[i] 表示前 ii 个字符的奇偶状态,则区间 [l,r][l, r] 的状态为:

    state(l,r)=pref[r]pref[l1]\text{state}(l, r) = pref[r] \oplus pref[l-1]

    区间合法的条件是:

    popcount(state(l,r))1\text{popcount}(\text{state}(l, r)) \leq 1

    3. 二分答案 + 可行性判断

    二分框架

    • [1,n][1, n] 范围内二分最短长度 LL
    • 判断是否存在分割方案,使得所有区间长度 L\geq L 且都合法

    可行性判断

    • 定义 f[i]f[i] 表示前 ii 个字符能否合法分割
    • 对于每个位置 ii,检查所有可能的 jj 使得:
      • f[j]=truef[j] = \text{true}
      • ijLi - j \geq L
      • popcount(pref[i]pref[j])1\text{popcount}(pref[i] \oplus pref[j]) \leq 1
    • 由于合法的 pref[j]pref[j] 只有 2727 种可能(当前状态或翻转1位),可以 O(26)O(26) 判断

    4. 状态压缩优化

    直接使用 2262^{26} 大小的数组会超内存,因此:

    • 对实际出现的前缀状态进行离散化
    • 只存储出现过的状态,大大减少内存使用

    算法流程

    1. 计算前缀奇偶状态 pref[0..n]pref[0..n]
    2. 离散化所有前缀状态
    3. 二分最短长度 LL
    4. 对每个 LL,用动态规划判断可行性
    5. 输出最优解并构造分割方案

    复杂度分析

    • 时间复杂度O(26nlogn)O(26n \log n)
    • 空间复杂度O(n)O(n)

    该算法通过状态压缩离散化巧妙处理了大状态空间问题,利用二分答案动态规划高效求解了最优化问题。

    • 1

    信息

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