[AC自动机]个人对于AC自动机的理解
来源:互联网 发布:java精品课程网 编辑:程序博客网 时间:2024/06/05 01:45
首先,AC自动机应该是一个FA,即有限状态自动机。
任意一个有限状态自动机
那么对于AC自动机而言,它是以trie树为基础,并以trie树结点为它的状态的自动机,它的五元组分别是如下含义:
显然,由这些定义,我们就可以完成多模板串匹配,先将所有模板建成trie树,再建立上述AC自动机,对于每一个输入的串st,我们从trie树的根开始,然后不断按照转移函数
那么如何构建AC自动机呢?
首先我们需要构建trie树,这样我们就构建好了除了转移函数以外的所有部分,那么剩下的我们就是要构建转移函数。
根据转移函数的定义,我们可以发现,假如当前状态是p,我们一直沿着p的
对于目前状态
如果
否则,如果p是初始状态,则返回p,否则返回
那么又有一个问题,
显然,由
特别地,初始状态的
这样我们就完成了AC自动机的构建。
代码如下:
inline void build(){ int l, r; rt->fail = rt; for(q[l = r = 0] = (int)rt; l <= r; l++){ Node *p = (Node *)q[l]; REP(i, 26) if (p->nxt[i]) q[++r] = (int)(p->nxt[i]), p->nxt[i]->fail = p == rt ? rt : p->fail->nxt[i]; else p->nxt[i] = p == rt ? rt : p->fail->nxt[i]; }}
之后,我们发现AC自动机提供了一些副产品,比如fail树。
所谓fail树,就是把trie树中所有节点之间原来的边删去,仅保留fail边,然后反向所有fail边构成的树。
显然对于某个结点u,它的所有祖先都是它的后缀。
这样利用fail树我们可以知道对于给出的某一本字典,其中的任意一个单词在字典中出现了几次。
- [AC自动机]个人对于AC自动机的理解
- 对ac自动机的一些个人理解
- AC自动机-理解
- AC自动机fail边的理解
- AC自动机的学习
- AC自动机...
- AC自动机
- AC 自动机
- AC自动机
- AC自动机
- ac自动机
- ac自动机
- AC自动机
- AC自动机
- AC自动机
- AC自动机
- AC自动机
- AC 自动机
- JavaScript:wihdow.onload与DOMContentLoaded,onreadystate
- servlet (4) HttpServletRequest 和HttpServletResponse
- POJ-2864
- OC-随便看看
- 在linux下编写动态链接库的步骤
- [AC自动机]个人对于AC自动机的理解
- J2EE——Jsp的学习
- 【92】【H】【leetcode】 Search in Rotated Sorted Array
- OC-类别与扩展
- 福克纳诺贝尔文学奖获奖演说
- SQLiteDatabase
- OC-访问控制与安全
- HDU 5592 ZYB's Premutation
- TKY工作总结