[AGC066C] Delete AAB or BAA
\(\mathbf{Part.-1}\)
给定一个由字符 A 和 B 组成的字符串 \(S\) 。
在这根绳子上,您可以反复执行以下操作:
在字符串 \(S\) 中选择三个连续且相等的字符,这些字符要么是 AAB 要么是 BAA,然后将这三个字符从 \(S\) 中删除(删除后,剩余的字符会连接在一起)。
找出能执行此操作的最大次数。
给出 \(T\) 个测试用例;请分别求解。
\(\mathbf{Part. 0}\)
初始对题目结构的观察是重要的。
这题有两个显然的方向:
- 考虑
A和B的连通块 - 考虑操作区间的性质
对于第一种,它很可做,但是就是做不出来。
对于第二种,我们称一个操作 AAB 和 BAA 的操作区间 \([i, j]\) 为这三个字符在原字符串上最左边到最右边的区间。1
由于删除的三个字符是连续的,所以操作区间一定不会相交。因此,操作区间是嵌套的4。所以操作序列构成笛卡尔树的形式。
\(\mathbf{Part. 1}\)
我们先从简单的情况入手,考虑如何判断整个序列都能被消除。
首先,以 A,B 个数为观察对象。容易发现,B 的个数一定要等于 \(\dfrac{n}{3}\)。2
继续从简单的情况入手,由 \((1)\),考虑观察一个操作区间。对于一个操作区间 \([i, j]\),首先它一定要满足 \((2)\)。然后,我们发现最后一步的消除 \((i, x, j)\) 一定是以 \(i\) 开头,\(j\) 结尾的。又因为只有 AAB 和 BAA 的三个数可以消除,所以 \(x\) 一定为 A,\(i, j\) 一定分别为 AB 或 BA。3
考虑回到整个序列。我们现在知道了操作区间有性质,再考虑整个序列,我们容易发现它能被分成若干个操作区间。
因此,我们有两个必要条件:
- 由 \((2)\),
B的个数一定要等于 \(\dfrac{n}{3}\)。 - 把整个序列划分成若干个区间,对于每一个区间,我们都要满足:
- 由 \((2)\),
B的个数一定要等于 \(\dfrac{len}{3}\)。 - 由 \((3)\),开头和结尾一定有一个
A一个B。
- 由 \((2)\),
\(\mathbf{Part. 2}\)
发现这个形式很归纳啊!而且如果这两个性质就是充分的话,就很舒服了。
我们可以尝试构造这样的不满足的情况,但你发现构造不出来。那能不能证?
事实上是可以的。由 \((4)\),操作区间实际上是嵌套的,每个操作区间都可以被分成多个小的操作区间。因此考虑归纳。
- 长度为 \(3\) 时,结论显然。
- 当长度为 \(len\) 时,我们容易发现存在长度 \(\geq 2\) 的
A连续段。由于总共B的个数 \(\geq 2\),显然可以找到连续段的一段删除AAB或BAA后仍保证开头和结尾为A和B。
因此,我们成功知道了一个序列全部消除的充要条件。
于是,接下来靠题感都能做了。我们直接考虑 \(f_x\) 表示前 \(x\) 个字符,最少留下几个。转移是枚举 \(1 \leq j < x\),然后判断 \([j + 1, x - 1]\) 能否全部消除。这是朴素的。
\(\mathbf{Part. +\infin}\)
以下是我自己的思考。显然,拿到一道题的第一感觉对于结论题来说十分重要。
这道题操作的结构是什么?对于每个连通块,操作一定发生在连通块的边界处。这是对的,也可以继续往下做,但是够深刻吗?
我们发现,如果一个连通块消失了,两边的连通块会合并,这不好刻画。
更加深刻的理解是:对于每一个操作,它组成的 \([l, r]\) 一定是嵌套的,呈现笛卡尔树的形式。
这个理解完全包含了连通块的理解,而且更加可做。这也不是特别难想,但是为什么我们想不到?或者说,为什么我们不会往这个方向想。
事实上,一道题的正确做法是线性的,是一条链,但是可能的所有解法构成一颗树。然而,我们的思维也是线性的,而且我们会讨厌推翻前面的一切做法,重新再来。
这是我们要跳脱出来的点。

浙公网安备 33010602011771号