题解:CF2048I2 Kevin and Puzzle (Hard Version)

· · 题解

根据简单版本,可以发现大部分情况解的个数并不多,因为对于 LR,LL 和 RR,对于里面的部分填完后,外层只有唯一的填法。因此如果没有一层是 RL,那么答案必然是 1

接下来考虑有 RL 的情况,不妨假设 RL 是最外部的两个字符。

可以证明的是:这个 RL 中 R 位置和 L 位置填的数是相同的。具体证明在此省略,读者自证不难。

不妨设这个相同的值为 m。接下来,枚举最右侧填 m 的 R 位置 x,和最左侧填 m 的 L 位置 y。讨论一下 x,y 的关系:

最后仅需要对上述情况分别计数即可。x>y 的情况容易 O(n) 统计,对于 x<y 的情况,不妨 a\ge b,可以枚举 y,计算出 y 前面连续的极长 R 的个数 cnt,那么对 a 的限制变成了 b\le a\le b+cnt

通过上述观察,我们总共只需要枚举 O(n)x,y 并判断其是否会对答案增加 1。也就是说,答案是 O(n) 级别的。

最后的问题是:每次给定一组区间 [l,r],问这个字符串每次取出首尾字符时,是否存在 RL 的情况。

一种简单的解决方法是,使用 bitset 维护,例如从小到大扫描 r,以 bitset 维护对于每个 l+r,是否存在 RL 的情况。该做法的时间复杂度为 O(\dfrac {n^2}{\omega}),可以通过本题。

如果使用分块卷积,可以做到更优的复杂度。事实上,如果继续深挖性质,可以做到 O(n\log ^2n) 的时间复杂度(需要使用卷积),如果你对此感兴趣可以自行研究。