Loading

[AGC066C] Delete AAB or BAA

\(\mathbf{Part.-1}\)

给定一个由字符 AB 组成的字符串 \(S\)

在这根绳子上,您可以反复执行以下操作:

在字符串 \(S\) 中选择三个连续且相等的字符,这些字符要么是 AAB 要么是 BAA,然后将这三个字符从 \(S\) 中删除(删除后,剩余的字符会连接在一起)。

找出能执行此操作的最大次数。

给出 \(T\) 个测试用例;请分别求解。

\(\mathbf{Part. 0}\)

初始对题目结构的观察是重要的。

这题有两个显然的方向:

  • 考虑 AB 的连通块
  • 考虑操作区间的性质

对于第一种,它很可做,但是就是做不出来。

对于第二种,我们称一个操作 AABBAA 的操作区间 \([i, j]\) 为这三个字符在原字符串上最左边到最右边的区间。1

由于删除的三个字符是连续的,所以操作区间一定不会相交。因此,操作区间是嵌套的4。所以操作序列构成笛卡尔树的形式。

\(\mathbf{Part. 1}\)

我们先从简单的情况入手,考虑如何判断整个序列都能被消除。

首先,以 AB 个数为观察对象。容易发现,B 的个数一定要等于 \(\dfrac{n}{3}\)2

继续从简单的情况入手,由 \((1)\),考虑观察一个操作区间。对于一个操作区间 \([i, j]\),首先它一定要满足 \((2)\)。然后,我们发现最后一步的消除 \((i, x, j)\) 一定是以 \(i\) 开头,\(j\) 结尾的。又因为只有 AABBAA 的三个数可以消除,所以 \(x\) 一定为 A\(i, j\) 一定分别为 ABBA3

考虑回到整个序列。我们现在知道了操作区间有性质,再考虑整个序列,我们容易发现它能被分成若干个操作区间。

因此,我们有两个必要条件:

  • \((2)\)B 的个数一定要等于 \(\dfrac{n}{3}\)
  • 把整个序列划分成若干个区间,对于每一个区间,我们都要满足:
    • \((2)\)B 的个数一定要等于 \(\dfrac{len}{3}\)
    • \((3)\),开头和结尾一定有一个 A 一个 B

\(\mathbf{Part. 2}\)

发现这个形式很归纳啊!而且如果这两个性质就是充分的话,就很舒服了。

我们可以尝试构造这样的不满足的情况,但你发现构造不出来。那能不能证?

事实上是可以的。由 \((4)\),操作区间实际上是嵌套的,每个操作区间都可以被分成多个小的操作区间。因此考虑归纳。

  • 长度为 \(3\) 时,结论显然。
  • 当长度为 \(len\) 时,我们容易发现存在长度 \(\geq 2\)A 连续段。由于总共 B 的个数 \(\geq 2\),显然可以找到连续段的一段删除 AABBAA 后仍保证开头和结尾为 AB

因此,我们成功知道了一个序列全部消除的充要条件。

于是,接下来靠题感都能做了。我们直接考虑 \(f_x\) 表示前 \(x\) 个字符,最少留下几个。转移是枚举 \(1 \leq j < x\),然后判断 \([j + 1, x - 1]\) 能否全部消除。这是朴素的。

\(\mathbf{Part. +\infin}\)

以下是我自己的思考。显然,拿到一道题的第一感觉对于结论题来说十分重要。

这道题操作的结构是什么?对于每个连通块,操作一定发生在连通块的边界处。这是对的,也可以继续往下做,但是够深刻吗?

我们发现,如果一个连通块消失了,两边的连通块会合并,这不好刻画。

更加深刻的理解是:对于每一个操作,它组成的 \([l, r]\) 一定是嵌套的,呈现笛卡尔树的形式。

这个理解完全包含了连通块的理解,而且更加可做。这也不是特别难想,但是为什么我们想不到?或者说,为什么我们不会往这个方向想。

事实上,一道题的正确做法是线性的,是一条链,但是可能的所有解法构成一颗树。然而,我们的思维也是线性的,而且我们会讨厌推翻前面的一切做法,重新再来。

这是我们要跳脱出来的点。

posted @ 2025-07-25 18:58  DE_aemmprty  阅读(17)  评论(0)    收藏  举报