KMP
例题
T1:最小循环节
如果 (n−next[n]) ( n − n e x t [ n ] ) 是n的因子,那么最小循环节长度就是这个,否则是n
T2:NOI2014动物园
沿着KMP自动机按照树边累加贡献
Hash
例题
T1:
把每个串丢进hash,求一下就行了
注意特判0
T2 UOJ后缀排序
二分+hash求LCP就行了
T3:
二分+hash,需要把hash值丢进splay维护
马拉车
例题
T1:
直接加起来就行了
T2:
hash去个重就行了
Trie
例题
T1:题面同前面
二分答案,按照height分为若干组
查询有没有一组超过k
在树上跑的时候加权值判断一下
要特判0
AC自动机
例题
T1:TJOI2013
沿着fail树直接累加贡献
T2:POI2000
如果某个前缀的fail包含了某个模式串,那么这个前缀也包含某个模式串
把所有模式串打上标记,标记沿fail树下传
考虑没有打标记的结点,如果存在环则有长度无限的主串
后缀数组
例题
T1:
二分答案,按height将后缀分为若干组,查找有没有某一组后缀个数>=k即可
T2:JSOI2007 字符加密
倍长
T3:AHOI2013差异
后缀自动机
例题
T1:封印
加字符串以及在末尾加字符都是很好处理的
在开头加字符我们需要在SAM的反串后缀树上跳才正确
查询的时候在dfs序上用主席树查询
T2:诸神眷顾的幻想乡
给每个叶子结点建立一颗trie
合并成一颗trie
给这颗trie建SAM,求一遍
Σlen[x]−len[fail[x]]
Σ
l
e
n
[
x
]
−
l
e
n
[
f
a
i
l
[
x
]
]
‘
后缀平衡树
SAM很多东西是不能动态的
于是出现了后缀平衡树
本质上是用平衡树维护后缀数组
对于每个后缀维护一个标号,满足较小的后缀标号较小
标号按照类似线段树的思想标号
但是这样就不能旋转了
做法①:不旋转(使用替罪羊树)
做法②:保证旋转的复杂度(使用treap)
例题
T1:BZOJ2555
当然是SAM+LCT啦(逃)
可以用后缀平衡树
询问等价于>=t,
T2:STRQUERY
考虑如何维护
只考虑在头尾插入删除
先考虑维护一个正向一个反向的后缀平衡树
那么在头尾插入删除就相当于对这两个后缀平衡树进行操作
考虑中间怎么处理
从中间截断,前后各维护两个,总共维护4个后缀平衡树,每次在对应位置操作。然后维护两段长度相等
询问操作如果单在左边右边我们只要在平衡树内查询即可。如果跨了左右平衡树,那么我们暴力kmp做,时间复杂度是可以保证的