题解:P9753 [CSP-S 2023] 消消乐【哈希,DP】
P9753 [CSP-S 2023] 消消乐
做法一:哈希 + 栈
考虑用栈来刻画合法子串。
枚举起始点,用栈扫一遍,记录出现了几次空栈,即可做到
考虑优化,尝试能否只扫一遍就计算出答案。
假设当前栈状态为
- 当
|t|=2 ,显然s 不变。 - 当
|t|>2 时,归纳假设:任意长度<|t| 的合法串的入栈都不会使s 改变。- 当
t=c_1+a+c_2 ,其中c_1 和c_2 为两个相等的字符,a 为任意合法串。 -
-
- 当
t=b_1+b_2+\cdots+b_k 时,其中b_i 为任意合法串。显然s 不变。
- 当
综上所述,
那么反过来归纳一下,假设任意长度
-
-
- 显然 $t$ 一定存在相邻两个相等的字符。 - 把 $t$ 中任意两个相邻相等的字符删去得到 $t'$,$t'$ 的能使栈状态不变,根据归纳假设,$t'$ 是合法串。 - 显然在合法串任意位置中加入两个相邻相等的字符后还是合法串。
于是可证这个条件是充要的。也就是说,我们从
于是我们 哈希 + map 记录扫到每个位置时栈的状态即可,复杂度
Code
做法二:DP
设
考虑转移,
考虑如何求出
- 设
j>i ,且以x=j-1 为起始点,不断跳到g(x)-1 ,能跳到i 。 - 反证法。假设存在
k>j ,使得s[k]=s[j] ,且k 能跳到i 。 - 显然
s[i+1,j-1] 和s[i+1,k-1] 都是合法串。 - 根据 做法一 中证明的结论,可以发现
s[j,k-1] 是合法串。 - 因此一定存在
t\in[j+1,k-1] ,使得s[t]=s[j] ,且在合法串s[j,k-1] 中,t 和j 是匹配的。 - 因此
s[j,t] 是合法串。 - 因此
s[t+1,k-1] 是合法串。 - 又因为
s[t]=s[j]=s[k] ,于是k 最多跳到t 就会停止,不会跳到i 。假设不成立。 - 综上所述,每个点最多会被每种颜色中的一个点跳到,故复杂度为
O(n|\Sigma|) 。
Code
通过简单处理即可做到