P9753 [CSP-S 2023] 消消乐 题解
:::::info[题目基本信息]
考察:哈希 hashing。
题目简述:
定义匹配字符串如下:
- 空串是匹配字符串。
- 若
\text{p} 是一个小写字母,S 是匹配字符串,那么\text{p}+S+\text{p} 是匹配字符串,其中定义字符串意义下+ 表示连接,下同。 - 若
S,T 是匹配字符串,那么S+T 是匹配字符串。
给定一个长度为
数据范围:
-
1\le n\le 2\times 10^6 ::::: :::::info[闲话] 由于 lca 要求证明结论所以出现了这篇题解。
显然下面的东西是老师上课讲的。
::::: 令s_{(l,r)} 表示子串\displaystyle\sum_{i=l}^rs_i 。
结论:s_{(l,r)} 是匹配字符串当且仅当处理l 前和处理完r 后匹配时用的栈内元素和顺序完全相同。 :::::success[证明] 先证明一个小结论: - 字符串是否匹配与匹配顺序无关。
::::success[小结论 1 证明]
设一个字符串
- 若匹配第一、四个
\text{p} 和第二、三个\text{p} :
容易发现str 是一个匹配字符串。 - 若匹配第一、二个
\text{p} 和第三、四个\text{p} :
容易发现str 也是一个匹配字符串。
所以
::::
再证明一个小结论:匹配字符串性具有前后缀可减性。更详细地:
- 若
S 以及S_{(1,k)} (k\in\mathbb N^* )都是匹配字符串,那么S_{(k,|S|)} 也是匹配字符串。 - 若
S 以及S_{(k,|S|)} (k\in\mathbb N^* )都是匹配字符串,那么S_{(1,k)} 也是匹配字符串。
| ::::success[小结论 2 证明]
以证明小结论 2-1 为例: 若 $S_{(k, |
S | )} 小结论 2 类似。 |
|---|
现在我们可以证明这个结论了。
::::success[充分性]
设
::::
::::success[必要性]
考虑反证法。
如果
::::
:::::
现在我们证明了结论,容易发现这个东西可以哈希。
然后做完了。
时空复杂度均为