1 条题解
-
0
自动搬运
来自洛谷,原作者为

Rainbow_qwq
**搬运于
2025-08-24 22:44:24,当前版本为作者最后更新于2023-12-05 22:37:36,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
简要题意:每次询问 ,求 的子串 满足 的本质不同子串 个数。
设 即询问串。
我们把贡献分成多个部分统计。
先统计掉所有满足 的串(即将 重复一次后就出现小于的情况)。
可以先做后缀排序,然后在后缀数组上二分 的位置,把在这个位置之前且不为 前缀的所有串计入答案。二分需要比较,比较只需要求 和某个后缀的 LCP,可以求两次 LCP 来实现。
剩下情况要统计 ,其中 且 为 的一个前缀。
任意一个 的情况都能等价成 的情况。首先要求一下 在原串中能匹配最长的前缀长度(来计算每个 有多少个 ),由于之前在后缀数组上二分了 的位置,这个就不难求出。
然后考虑 每个前缀 在怎样的条件下符合。
设 ,考虑比较 和 的过程,先把两个串开头的 消掉,然后发现就是求 和 的 LCP 的过程(如果 和 又匹配了一个 的长度,那就是又消掉了一个 继续匹配,并且接下来也是 ,所以相当于匹配 。
那我们把比较 和 转化成了比较 (对应 ) 和 (对应 )。
继续讨论下一步匹配:
如果 不是 的前缀,那 匹配 就会在某个位置出现不同,也就是要求 。于是先二分一下 在原串后缀数组中的位置,求符合条件的 就是一个二维数点(开始位置在一个区间内,字典序在一个后缀内)。当然这里二维数点完后,要容斥减去所有 是 的前缀的错误贡献,这个等下会解释做法。
如果 是 的前缀,那说明 是 的一个周期, 是 的一个 border。
接下来设 ,那转化成了比较 (对应 )和 (对应 )。
如果 ,那么 也是 的一个 border,此时发现会无限匹配,那不用计入答案,也不需要考虑之后的匹配了!
如果 ,那么会在比较 和 的时候得到结果,如果 则会计入答案。
(省流:只要比较往后的一个 的循环节是否正确,如果正确就无限匹配了,不会计入答案;如果错误就可以计算答案)
在特殊性质 A 下,能在串中找到一个开头包含了 的后缀起始位置。把询问串的位置移到这里,直接用上文的二维数点,那贡献就是对的了。
如果没有特殊性质,假设 所在位置后缀的开头是 ()。那直接二维数点的话,对于所有 border ,就是在拿 和 比较,这个贡献是错误的。
那就先减去 和 比较的错误贡献,再加上 和 比较的正确贡献。下面是对于所有 border 算贡献的方法:
用基本子串字典求出每个 border group,在每个 group 中都满足 的形式。
考虑一个性质, 的字典序是单调的。于是可以二分一个位置,使得其中一半的串满足条件。只需要做比较操作,也就是 LCP 操作。
时间复杂度 ,瓶颈在最后一部分的 次二分以及基本子串字典的查询。
- 1
信息
- ID
- 7789
- 时间
- 6000ms
- 内存
- 2048MiB
- 难度
- 7
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者