Commit 8673b776 authored by sshwy's avatar sshwy
Browse files

删除一些空行

parent b399b8a0
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -25,7 +25,6 @@ AC自动机利用一个fail指针来辅助多模式串的匹配。
状态 $u$ 的 fail 指针指向另一个状态 $v$ ,其中 $v\in Q$ ,且 $v$ 是 $u$ 的最长后缀(即在若干个后缀状态中取最长的一个作为 fail 指针)。对于学过KMP的朋友,我在这里简单对比一下这里的 fail 指针与 KMP 中的 next 指针:

1. 共同点:两者同样是在失配的时候用于跳转的指针。

2. 不同点:next 指针求的是最长 Border(即最长的相同前后缀),而 fail 指针指向所有模式串的前缀中匹配当前状态的最长后缀。

因为 KMP 只对一个模式串做匹配,而 AC 自动机要对多个模式串做匹配。有可能 fail 指针指向的结点对应着另一个模式串,两者前缀不同。
@@ -43,9 +42,7 @@ AC 自动机在做匹配时,同一位上可匹配多个模式串。
考虑字典树中当前的结点 $u$,$u$ 的父结点是 $p$,$p$ 通过字符 `c` 的边指向 $u$,即 $trie[p,c]=u$。假设深度小于 $u$ 的所有结点的 fail 指针都已求得。

1. 如果 $trie[fail[p],c]$ 存在:则让 u 的 fail 指针指向 $trie[fail[p],c]$。相当于在 $p$ 和 $fail[p]$ 后面加一个字符 `c`,分别对应 $u$ 和 $fail[u]$。

2. 如果 $trie[fail[p],c]$ 不存在:那么我们继续找到 $trie[fail[fail[p]],c]$ 。重复 1 的判断过程,一直跳 fail 指针直到根结点。

3. 如果真的没有,就让 fail 指针指向根结点。

如此即完成了 $fail[u]$ 的构建。