约定

  1. 通常表示一个字符串。
  2. 表示的长度。
  3. 表示的第个字符,表示构成的子串。
  4. 表示的 fail 指针。
  5. 表示拼在一起。

Border

在进阶之前先铺垫一个基础概念——Border。KMP 的 fail 指针指向的是它的一个最长的 Border。

如果整除,那么就是一个循环串。

对于一个串,如果它的最长 Border 的长度为,且,那么就可以写成的形式,且的后缀。此时最长的 Border 是。这种情况下的 fail 链是。相当于每一次跳一个

Rank KMP

For sequenceandlength of, we saysimilar to, IFF for alland,.

Now you have two sequenceand, consider the number of consistent subsequence ofthat similar to.

.

与 KMP 算法类似。在扩展的时候,KMP 是判断两个字符是否相等。这里我们则改为判断两个字符在前面的排名是否相同。

主席树即可。

时间复杂度

树上 KMP

给一个 Trie,求每个点到根的路径表示的字符串的最长 Border。

对于的父节点,假设到的串表示为,那么每次跳 fail 匹配的是同一个字符。因此如果不匹配就可以直接跳到了。如果不是就正常跳 fail。这样每次至少减少一半,复杂度

CHO-Hamsters

给出互不包含的字符串,要求你求出一个最短的字符串,使得这个字符串在中总共至少出现次,问最短长度。

表示中出现了次这个字符串,末位字符串是的最短长度。

套一个矩阵乘法即可。

时间复杂度

Fedya the Potter Strikes Back

给定长度为的字符串和权值数组

定义的⼀个⼦串是好的,当且仅当这个⼦串等于的某个前缀。

⼀个⼦串的权值是的最⼩值。

对于的每个前缀,求他的所有好的⼦串的权值之和。

相当于,对求它所有后缀 border 的权值之和。考虑 KMP 算法。从扩展到时:

  • 有可能删除一些 border。删除的个数是均摊的。
  • 有可能增加一个长度为的 border。
  • 其他的的 border 末尾添加,就变成了的 border。

那么,想办法找到被删除的 border,然后维护一下权值即可。

对每个 border 维护一下它最远能延伸到的位置即可。

时间复杂度

SZA-Template

给出一个字符串,求一个长度最小的字符串使得可以被印出来。

印的规则是:重叠部分的字符串要一样。

求出的 next 数组。

表示前缀的答案。

那么。因为你要印出,就得先印出

的条件是,存在一个

时间复杂度