算法
因为这题是从差分约束专题来的, 所以肯定要朝着化为不等式的方向化简
令 \(TimeW_i, TimeD_i, TimeL_i\) 表示原串前 \(i\) 位中 \(W, D, L\) 的个数
令 \(W_i, D_i, L_i\) 表示最后结果中前 \(i\) 位 \(W, D, L\) 的个数
根据原串有
根据题目约束条件有
仅仅化成这样是不可做的
直觉上感觉可以挨个枚举, 这是符合人类本能的(
考虑 $ W_i + D_i + L_i = i $ , 从 \(n\) 到 \(1\) 枚举 \(i\) , 每一次 \(W_i + D_i + L_i\) 的变化量能且仅能为 \(1\)
假设每一次选择减少的序列为 \(S\)
则有:
对于约束条件
令 \(u = \max(W_n, L_n), v = \min(W_n, L_n)\) 对应的字符
则 \(S\) 中 \(v\) 可在一定区间内滑动, 以保证 \(\mid W_i - L_i \mid < k\)
令 \(dis1_i\) 表示 \(u\) 在 \(i\) 处的变化量, \(dis2_i\) 表示 \(v\) 在 \(i\) 处的变化量的相反数, 有 \(dis1_i, -dis2_i \in \{ 0, 1 \}\), \(dis1_i - dis2_i \in \{ 0, 1 \}\)
枚举 \(W_n\) , 得到 \(L_n, D_n\)
关于原串中的约束和题目中的约束, 用 \(\sum^{i = 1}_{j} dis1_i, \sum^{i = 1}_{j} dis2_i, L_n, D_n, W_n\) 显然可以表示, 不加赘述
用 \(dis\) 表示 \(dis1, dis2\) 的倒序前缀和
则有
代码
后补
总结
这种三种 / 两种填充方式的图 (本题中的 \(D\) 并没有什么卵用), 考虑记为 \(1, 0, -1\) 处理
呜呜呜, 他为什么这么聪明