哈希

基本作用:判断两个串是否相同。
构造方式:设 \(F(S_n)\)\(S\) 的哈希值,选取的基数为 \(b\),模式为 \(p\),则 \(F(S_n)=F(S_{n-1})\times b+S_n \pmod p\)
常用模数:1610612741,1e9+7,1e9+9,自然溢出。

树哈希:
可以用来判断树是否同构。
一种树哈希的方式:设 \(F_n\) 为以 \(1\) 为根的树中节点 \(n\) 子树的值。
先将 \(n\) 的子树的哈希值从小到大排序,\(v_i\) 是排好序后 \(n\) 的第 \(i\) 个儿子,则 \(F_n=size_{n} \times \sum_{i=1}^{size_{n}}F(v_i) \times b^i \pmod p\)

哈希表:可以干和map差不多的事,效率接近 \(O(1)\)
例:给定 \(n\) 个数字,问其中互不相同的数字个数。
考虑将所有数字对 \(p\) 取模,对于 \(0 \sim p-1\)都建立一个链表,第 \(i\) 个链表里存对 \(p\) 取模以后结果为 \(i\) 的所有数,若有重复的数字不重复记录,每次询问查表即可。

kmp

例:给定串 \(S,T\),问 \(T\)\(S\) 中出现了多少次。
算法流程:先对 \(T\) 求出数组 border,代表 \(T_{1 \sim border_i}=T_{i-border_{i}+1 \sim i}\),其中 border 取最大值,且不与 \(i\) 值相同,再利用 border 数组扫一遍即可,时间复杂度可以证明均摊 \(O(N)\)

exkmp:
例:求出串 \(T\)\(S\) 的每一个后缀的 LCP(LCP 是最长公共前缀)。
算法流程:先求出 las 数组,las 定义为 \(T\)\(T\) 的每一个后缀的 LCP 长度,再用类似的方法求解最终解即可。

AC自动机

例:给出 \(n\) 个模式串 \(S_i\) 和一个文本串 \(T\) ,求多少不同的模式串在文本串中出现过。
算法流程:首先对于 \(T\) 建一棵 trie 树,求出 fail 数组,fail 定义和 kmp 算法中 border 定义类似,匹配时暴力跳 las 即可,AC 自动机有个重要应用是建 fail 树。