P12960 题解

· · 题解

首先我们分析 \text{Bob} 的策略:设 T_0 为空串,对于 1 \le i \le m\text{Bob} 会将 T_i 重排为字典序 \ge T_{i - 1} 的所有串中,字典序最小的那一个。正确性显然。

考虑如何构造方案:枚举 \text{LCP}(T_i,T_{i - 1}) 的长度,找到最大的长度 x 使得以下条件之一成立:

直接用桶记录每个元素出现次数即可判定,对于给定的方案我们可以做到 \mathcal{O}(n)

Subtask #1

因为 m \le 3,所以至多有 \binom{n - 1}{2} 种本质不同的分割方式,我们考虑直接枚举这些分隔点,对每种情况模拟 \text{Bob} 的最优策略即可,时间复杂度 \mathcal{O}(n^3)

值得一提的是,当 m = 2 时我们可以在线性时间复杂度内解决这个问题。只需要从左往右移动唯一的分割点,对左侧 T_1 和右侧 T_2 分别开一个桶维护每种字符出现次数。移动一次分界点只会在左侧的桶中假如一个元素、在右侧的桶中删除一个元素,修改/判定都是 \mathcal{O}(1) 的,因此总时间复杂度可以做到 \mathcal{O}(n)

Subtask #2

由上一个子任务我们已经可以解决 m = 2 的情况。

对于 m = n 的情况,每个子串都只有一个字符,\text{Bob} 无法有效重排任何一个子串,所以只需要比较原串相邻字符的字典序即可在 \mathcal{O}(n) 时间复杂度内解决问题。

对于 m \ge 4 的情况,我们发现对 \text{Alice} 的限制是松的,考虑找出能使 \text{Alice} 必胜的最小子结构:

仅剩 m=3 的最困难情况尚未解决。假设 \text{Alice} 将字符串 s 拆分为三部分 A,B,C(即 s=ABC)。显然:

  1. 若以 m=2 对应构造方式分割子串 AB 结果为 A,B\text{Alice} 获胜,则 A,B,C 构成 m=3 下输入串 s=ABC 的有效分割方案。
  2. 若以 m=2 对应构造方式分割子串 BC 结果为 B,C\text{Alice} 获胜,则 A,B,C 同样构成 m=3 下输入串 s=ABC 的有效方案。

一个结论是:对任意字符串 s\text{Alice} 获胜当且仅当上述两种情况之一成立。这并非显而易见:存在有效分割 A,B,C 既不满足 AB 分割有效也不满足 BC 分割有效的反例,例如输入串 XYAZXY 的分割 XY/AZ/XY。但在所有此类情形中,必然存在满足条件的其他有效分割方案。

以 XYAZXY 为例,XY/A/ZXY 即为有效分割(因 XY/A 满足 m=2 的获胜条件)。证法和 m \ge 4 类似,同样考虑最小子结构,如果不能单独成段必定无解,否则所有有解情况和最小拆分情况必定一一对应。

最终,我们只需检验 \text{Alice} 能否在 m=2 条件下赢得 s 的某个前缀或后缀。总时间复杂度 \mathcal{O}(n)