专栏文章
题解:P9753 [CSP-S 2023] 消消乐【哈希,DP】
P9753题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minid48j
- 此快照首次捕获于
- 2025/12/02 02:54 3 个月前
- 此快照最后确认于
- 2025/12/02 02:54 3 个月前
P9753 [CSP-S 2023] 消消乐
做法一:哈希 + 栈
考虑用栈来刻画合法子串。
枚举起始点,用栈扫一遍,记录出现了几次空栈,即可做到 , pts。
考虑优化,尝试能否只扫一遍就计算出答案。
假设当前栈状态为 ,然后让 按顺序接受一个合法串 ,看一下接受后的 是什么样的,
- 当 ,显然 不变。
- 当 时,归纳假设:任意长度 的合法串的入栈都不会使 改变。
- 当 ,其中 和 为两个相等的字符, 为任意合法串。
- 入栈时,若和栈顶元素抵消,由于 不会使 改变,那么 将会补回抵消的 ,因此 不变。
- 入栈时,若没有和栈顶元素抵消,由于 不会使 改变,那么 将会和 抵消,因此 不变。
- 当 时,其中 为任意合法串。显然 不变。
- 当 ,其中 和 为两个相等的字符, 为任意合法串。
综上所述, 接受一个合法串后不会改变状态。
那么反过来归纳一下,假设任意长度 且不会改变 的串一定是合法串,
- 显然成立。
- 时,
- 显然 一定存在相邻两个相等的字符。
- 把 中任意两个相邻相等的字符删去得到 , 的能使栈状态不变,根据归纳假设, 是合法串。
- 显然在合法串任意位置中加入两个相邻相等的字符后还是合法串。
于是可证这个条件是充要的。也就是说,我们从 扫到 时,对于两个位置的状态相等的栈,中间一定存在一个合法子串。
于是我们 哈希 + map 记录扫到每个位置时栈的状态即可,复杂度 。单模哈希被卡了,笔者写了双模哈希。
做法二:DP
设 表示以 结尾的合法子串个数,这个比较容易想到。
考虑转移,。 表示最大的 ,使得 是合法子串。
- 设 ,且以 为起始点,不断跳到 ,能跳到 。
- 反证法。假设存在 ,使得 ,且 能跳到 。
- 显然 和 都是合法串。
- 根据 做法一 中证明的结论,可以发现 是合法串。
- 因此一定存在 ,使得 ,且在合法串 中, 和 是匹配的。
- 因此 是合法串。
- 因此 是合法串。
- 又因为 ,于是 最多跳到 就会停止,不会跳到 。假设不成立。
- 综上所述,每个点最多会被每种颜色中的一个点跳到,故复杂度为 。
通过简单处理即可做到 。Code
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...