一.模板复习
1.SA
倍增排序,每次排序,以前半个串为第一关键字,后半个串为第二关键字排序,排序可以用基数排序,复杂度O(nlogn)
一些比较适合在SA上做的题目:
1.LCP长度有关
2.一个经典套路:SA上按height启发式合并,例题:1.shopee杯武大校赛2019正赛C题 2.洛谷“小W与数列”
通常用来维护和LCP有关的最小化/最大化题目。
2.SAM
https://www.cnblogs.com/zjp-shadow/p/9218214.html#autoid-4-1-0
这位大佬已经讲得非常非常清楚了,无需我再啰嗦。
PS:本质不同子串个数不需要dp,直接求(sum (maxlen_i-maxlen_{fa_{i}})),这个是可以在线维护的。
拓展:广义SAM。
构建多串trie,用bfs序加入后缀自动机。
二.一句话题解
以下是按照洛谷题单"StringSuffixStructures I"写的
1.模板 广义后缀自动机
统计n个串的本质不同子串,就是先建广义SAM,然后对每个节点的maxlen-minlen求和
注意几个坑点:
1.按照我的写法,后缀自动机的空串节点是1,0是无意义节点。
2.记得连边(第一次是跳到直到有字符c的出边,第二次是跳到字符c的出边不再指向q)
3.后缀自动机要开两倍大小(节点数上界是2n-1)
2.[八省联考2018]制胡窜
先用线段树合并维护endpos,大力讨论
3.[NOI2018]你的名字