突然发现了一篇很棒的讲解ac自动机的文章https://www.cnblogs.com/nullzx/p/7499397.html,补上!~
终于get了一个新算法(。ì _ í。)
自己写了一遍之后结果结果是错的,debug半天才发现有个句子放错位置了,还是不够熟悉吧555
必备算法:KMP(失配时从哪里开始匹配才是最优的)+trie(字典树建树)
ac自动机的图如下:
具体过程我就不是很想讲了,可以看b站的视频,我觉得讲的蛮明白的:传送门
几个关键点:
- 当前节点的fail指向的是父节点fail下面和当前节点字母相同的节点:比如长字符串是shea,当和she匹配时,因为e后面没有a,所以e这个位置匹配失败,e(最左侧的e)的fail指向的是它的父节点h(最左侧的h)的fail:h(中间的h)下面的e(中间的e),然后在这个新的e(中间的e)的基础上向下匹配,可以匹配到a
- 节点的fail指向位置的字母和节点对应的字母相同
- 节点e的f