1. AC 自动机的 fail 指针为何用 BFS 构造?若用 DFS 会导致什么问题
请解释 Aho-Corasick 自动机的 fail 指针为什么必须用 BFS 构造,若改用 DFS 构造会导致什么问题?
- fail 指针的语义(指向最长真后缀对应的节点)
- BFS 保证层序(深度递增)构造的性质
- DFS 构造的缺陷(fail 目标未就绪)
AC 自动机的 fail 指针指向"当前节点代表字符串的最长真后缀"所在的节点。构造 fail 时,根节点的子节点 fail 指向根,其余节点的 fail 依赖其父节点的 fail。用 BFS 可以保证按深度递增的顺序处理每个节点,这样处理某个节点时,其父节点的 fail 以及 fail 链上的其他节点都已经构造完毕,可以正确求得 fail。若用 DFS,会沿着一条路径深入到底,此时一些祖先的兄弟节点(本应更早构造)尚未处理,导致 fail 指向的节点尚未完成构造,无法正确建立 fail 指针,甚至产生错误或死循环。
fail 指针的构造具有"自底向上、依赖已构造节点"的特性,BFS 的层序正好满足这种依赖顺序。DFS 破坏了这种顺序,因此必须用 BFS。