You Are Given Some Strings 题解
考虑在文本串上枚举每一个中间点作为 \(s_i\) 和 \(s_j\) 的分界点,所以 \(s_i\) 就是文本串分界点左边(以下简称左文本串)的后缀,\(s_j\) 就是文本串分界点右边(以下简称右文本串)的前缀。若将 ACAM 上的某个节点设为 \(a\),它的 fail 节点设为 \(b\),则根到 \(b\) 所代表的字符串一定是根到 \(a\) 所代表的字符串的后缀,所以我们可以在从左到右进行文本串查询操作的时候,把每个开始向上跳 fail 指针的起点作为分界点,那么这个点能向上跳到的终止结点的个数就是以该起点为结尾的后缀个数。
处理出每个分界点情况下的 \(s_i\) 个数之后,因为我们接下来要求的是前缀,所以我们再反向建一次 ACAM,再和求后缀的流程一样再跑一次即可。

浙公网安备 33010602011771号