2025.3.8 noip 模拟赛
T4:
题目大意:
有一个长度为 \(n\) 的串,由小写字母构成。
请问对于每个后缀,有多少非空字串 \(A,B\) 使得 \(s_{i \sim n} = AABA\)。
\(n \le 10 ^ 5\)
解题思路:
这题有个特殊点:它仅仅求的是后缀。
但也有他恶心的地方:A中间加了个B。
考虑枚举最后的 \(A\)。
设它的长度为 \(m\)。
那么发现当每个后缀字典序递增时,这个能影响到的一定是个区间内满足长度 \(> 3 \times m\) 的串。
这个区间就是前缀是 \(AA\) 的区间,不难发现这是字典序连续的。
考虑将所有后缀按照字典序排序。
只需用 hash+二分就可以在此题中取代SA的单 \(log\) 来做到 \(O(n \log^2 n)\) 的。
然后接下来对询问做差分之后就是一个二位数点。
扫描线即可。
总结:
考试时看到这个题就一直往 NOI2016优秀的拆分上想。
看来得限制自己每个思路当没有效果时就应该及时止损了。
同时也应该理性分析不同题目中做法之间的不同是什么。
比如这题与优秀的拆分的不同之处在于:

这就导致我们不得不转变 NOI2016优秀的拆分的套路。
优秀的拆分的 trick 的优势是统计全部,而不能统计非连续的 A。
这题我们可以通过给后缀排序后二分,这样只能统计后缀,不能统计全部,但可以解决不连续的问题。
NOI2016 优秀的拆分的 trick:考虑统计若干个连续且相同的字串时可以通过调和级数的时间复杂度来解决,但不连续就不行了。
此题 trick:满足前缀相同的排完字典序的字符串一定是一个连续的子段,但不满足字典序递增或者不是前缀就不行了。

浙公网安备 33010602011771号