大体上是翻译日文题解的,补充了部分证明。
首先先考虑一下什么串可以被删光。可以发现满足一下三个条件之一的长度为偶数的串一定可以被删光,而且这是充要的:
- 开头是
B
。
- 结尾是
A
。
- 存在一个 [1,n-1] 中的偶数 i,满足 s_i 是
A
,s_{i+1} 是 B
,即在偶数下标后面画一个 |
,存在 A|B
。
归纳证明。考虑从一个能被删完的串插入 AA
、BA
、BB
。只插入一次的串一定满足前两个条件之一。如果一个串满足第一个条件,只有在前面插入一个 AA
才能破坏掉它,这样就出现了一个 A|B
。如果一个串满足第二个条件,只有在后面插入一个 BB
才能破坏掉它,这样也出现了一个 A|B
。如果一个串满足了第三个,在除了 A|B
之外的地方插入不会破坏掉它,而在 A|B
中间插入 ??
,会变成 A|??|B
,只有 ??
是 AB
才能保证插入完后不存在 A|B
。
现在要匹配字符串 t_{1,2,\dots,m},很容易得到一个贪心。依次匹配 t_{1,2,\dots,m},维护上一次匹配的指针 x(初始为 0),每次找到 x 右边最左的一个 y,满足 x\not \equiv y\pmod 2,并且 [x+1,y-1] 可以被删除,并且 s_{y}=t_i。把 s_y 和 t_i 匹配,并且让 x=y
。最后,如果 [x+1,n] 能被删除, 就有解,否则无解。
发现当原串等于 BABB
、要匹配的串等于 BB
的时候假了,因为当 t_i 是 B
的时候,最小的 x 不一定最优。(为什么这样?在文末给出证明)。
因此当匹配的时候,如果 s_x 是 B
(为方便起见,规定 s_0 是 A
),那么只需要对于所有的满足 x'\ge x,x'\equiv x\pmod 2 的 x',找到 x' 右边最左的一个 y,满足 x'\not\equiv y\pmod 2,并且 [x'+1,y-1] 可以被删除,并且 s_y=t_i,就把 s_y 和 t_i 匹配。上例中,匹配到第一个 B
之后,x=1;匹配到第二个 B
时,找到 x'=3,y=4,第二个 B
和 s_4 匹配。
为什么这样是对的?这相当于一个反悔贪心,把上一次匹配的位置改为 x'。由于 s_x 是 B
,那么 [x,x'-1] 一定能被删完。
整理一下步骤。假如原串是 s_{1,2,\dots,n},要匹配的串是 t_{1,2,\dots,n}。
- 定义指针 x 为上一次匹配的位置,进一步地,它是上一次可能匹配地位置中最左的一个。初始
x=0
。从 i=1,2,\dots,m 依次匹配 t_i:
- 如果 s_x 是
A
:
- 如果 t_i 是
A
:找到 x 右边最左的位置 y,满足 x 和 y 的奇偶性不同,并且 s_y 是 A
,将 s_y 和 t_i 匹配。(那是因为,由于 y 是 x 右边最左的,如果 y\neq x+1,就要求 s_{x+1} 是 B
,此时 s_{[x+1,y-1]} 能被删完)。
- 如果 t_i 是
B
:找到 x 右边最左的位置 y,满足 x 和 y 的奇偶性不同,并且 s_{y-1} 是 A
,s_y 是 B
,将 s_y 和 t_i 匹配。(那是因为,只有这种情况 s_{[x+1,y-1]} 才能被删完)。
- 如果 s_x 是
B
:
- 找到 x 右边最左的位置 y,满足 x 和 y 奇偶性不同,并且 s_y=t_i,将 s_y 和 t_i 匹配。(那是因为,如果 s_{y-1} 是
A
,[x+1,y-1] 就能被删完;如果是 B
,就满足反悔的要求)。
- 匹配结束后,如果 s_{[x+1,n]} 能删完,有解;否则无解。特别地,如果 s_{x} 是
B
,还可以判断所有满足 x'\ge x,x'\equiv x\pmod 2 的 x',只要有一个 x' 使得 s_{[x'+1,n]} 能删完,就有解。否则无解。
容易发现,一个能被匹配的串和一个匹配过程中产生的 x 的序列一一对应,所以可以使用 DP 求解。具体地,可以设 f_i 表示当前匹配过程的 x 是 i 时的方案数,对于每个位置维护两个指针,分别表示 t 的下一位是 A
或 B
时 x 要移动到哪里。最后对于合法的终止位置 x 的 f 值求和即可。
最后证明一开始假的贪心为什么当 t_i 是 A
时是对的,而当 t_i 是 B
时是错的。
当 t_i 是 A
时,选最近的一定优。假设选 x' 更优,那么由于 s_{x'} 是 A
,[x+1,x'] 能被删除,所以选 x 更优。
当 t_i 是 B
时,BABB
这个例子已经很好地说明问题了。在正确地算法中,可以从 x 反悔到 x',然而在问题中,[x+1,x'] 不一定能被删除,这时就会有问题。
代码比较丑就不粘了,时间复杂度 O(n)。