题解:AT_toyota2023spring_final_f Forbidden Pattern

fydj

2025-01-08 20:23:09

Solution

大体上是翻译日文题解的,补充了部分证明。

首先先考虑一下什么串可以被删光。可以发现满足一下三个条件之一的长度为偶数的串一定可以被删光,而且这是充要的:

归纳证明。考虑从一个能被删完的串插入 AABABB。只插入一次的串一定满足前两个条件之一。如果一个串满足第一个条件,只有在前面插入一个 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_yt_i 匹配,并且让 x=y。最后,如果 [x+1,n] 能被删除, 就有解,否则无解。

发现当原串等于 BABB、要匹配的串等于 BB 的时候假了,因为当 t_iB 的时候,最小的 x 不一定最优。(为什么这样?在文末给出证明)。

因此当匹配的时候,如果 s_xB(为方便起见,规定 s_0A),那么只需要对于所有的满足 x'\ge x,x'\equiv x\pmod 2x',找到 x' 右边最左的一个 y,满足 x'\not\equiv y\pmod 2,并且 [x'+1,y-1] 可以被删除,并且 s_y=t_i,就把 s_yt_i 匹配。上例中,匹配到第一个 B 之后,x=1;匹配到第二个 B 时,找到 x'=3,y=4,第二个 Bs_4 匹配。

为什么这样是对的?这相当于一个反悔贪心,把上一次匹配的位置改为 x'。由于 s_xB,那么 [x,x'-1] 一定能被删完。

整理一下步骤。假如原串是 s_{1,2,\dots,n},要匹配的串是 t_{1,2,\dots,n}

容易发现,一个能被匹配的串和一个匹配过程中产生的 x 的序列一一对应,所以可以使用 DP 求解。具体地,可以设 f_i 表示当前匹配过程的 xi 时的方案数,对于每个位置维护两个指针,分别表示 t 的下一位是 ABx 要移动到哪里。最后对于合法的终止位置 xf 值求和即可。

最后证明一开始假的贪心为什么当 t_iA 时是对的,而当 t_iB 时是错的。

t_iA 时,选最近的一定优。假设选 x' 更优,那么由于 s_{x'}A[x+1,x'] 能被删除,所以选 x 更优。

t_iB 时,BABB 这个例子已经很好地说明问题了。在正确地算法中,可以从 x 反悔到 x',然而在问题中,[x+1,x'] 不一定能被删除,这时就会有问题。

代码比较丑就不粘了,时间复杂度 O(n)