P9753 [CSP-S 2023] 消消乐 题解

· · 题解

:::::info[题目基本信息] 考察:哈希 hashing。
题目简述:
定义匹配字符串如下:

  1. 空串是匹配字符串。
  2. \text{p} 是一个小写字母,S 是匹配字符串,那么 \text{p}+S+\text{p} 是匹配字符串,其中定义字符串意义下 + 表示连接,下同。
  3. S,T 是匹配字符串,那么 S+T 是匹配字符串。

给定一个长度为 n 的由小写字母构成的字符串 s,求它的非空匹配子串个数。
数据范围:

::::success[小结论 1 证明] 设一个字符串 str=\text{p}+a+\text{p}+b+\text{p}+c+\text{p},其中 a,b,c 是匹配字符串,\text{p} 是一个小写字母。

所以 str 的匹配顺序与是否匹配无关。
:::: 再证明一个小结论:匹配字符串性具有前后缀可减性。更详细地:

  1. S 以及 S_{(1,k)}k\in\mathbb N^*)都是匹配字符串,那么 S_{(k,|S|)} 也是匹配字符串。
  2. S 以及 S_{(k,|S|)}k\in\mathbb N^*)都是匹配字符串,那么 S_{(1,k)} 也是匹配字符串。
::::success[小结论 2 证明] 以证明小结论 2-1 为例:
若 $S_{(k,
S )} 不是匹配字符串,那么匹配后的栈非空,那么匹配 S 时的栈就是空栈合并非空栈,也是非空栈,这样 S$ 就不是匹配字符串,推出矛盾,得证。
小结论 2 类似。

现在我们可以证明这个结论了。
::::success[充分性] 设 s_{(1,l-1)}s_{(1,r)} 匹配后的栈序列为 st,同时设反栈序列为 \overline{st},那么由于小结论 1,\overline{st}+s_{(1,l-1)}\overline{st}+s_{(1,r)} 匹配后栈均为空,所以它们都是匹配字符串,又由于小结论 2,s_{(l,r)} 就是匹配字符串。
:::: ::::success[必要性] 考虑反证法。
如果 s_{(1,l-1)}s_{(1,r)} 的匹配时所用栈序列不同,s_{(l,r)} 匹配时一定添加或删去了一些字符,那么它就不是匹配字符串,推出矛盾。
:::: ::::: 现在我们证明了结论,容易发现这个东西可以哈希。
然后做完了。
时空复杂度均为 \Theta(n)