字符串小结
1.kmp 和 AC 自动机
AC自动机可以理解为多个串之间的kmp,具体还是非常简单。
首先建出 trie 树,接着你要做的就是将一段后缀连向与之相同的前缀,这样就构成了 fail tree。
具体应用:
1.求多个字符串分别在模式串出现的次数,在fail tree上解决即可。
2.做动态转移方程。
2. SA
重点在后缀排序,可以通过倍增以及基数排序解决。
\(height_i\):排名 \(i\) 的后缀与排名 \(i-1\) 的后缀的最长相同前缀。
性质: \(height_{i} \ge height_{i-1} +1\)。
证明:鸽。
3 .SAM
首先给出相关定义:
\(endpos(x)\):一些在原串中出现的(末尾)位置完全相同的等价类 \(x\)。
性质:一个等价类中显然是一串连续的后缀。
\(link(x)\):等价类中最短的那一个串的开头再缩减一次后得到的不同的等价类,这样构成了一个tree。
\(min/max len(x)\):等价类中最长的串和最短的串的长度。
具体实现:考虑已完成了原串 \(s_{1...i}\) 的 SAM,加入 \(i+1\)。首先显然有一些串必然 \(endpos\) 只有 \(i+1\)。然后一直往上面找,直到找到第一个等价类加上 \(s_{i+1}\) 能使以 \(i+1\) 为后缀的一段串出现在这一个等价类。
分成两种情况:
- \(maxlen_x + 1 =maxlen_y\) 直接加上 \(i+1\) 这一个元素即可。
- 不同的话将 \(y\) 这一个等价类拆成两个。
转移数和状态数都为 \(O(n)\)。
证明:鸽。
好用就行了
例题:
这就一个 SAM 就行了,看到以 \(l\) 为限制,那就倒着跑一遍 SAM,然后将询问离线下来做就完了,感觉自己写的巨抽象,写了一个 \(log^3\),用了 SEGBIT 和 BIT 和树剖。
好像本质不同子串个数这道题改一改就过了,感觉是真的板

浙公网安备 33010602011771号