使用AC自动机解决文章匹配多个候选词问题
解决的问题
KMP算法用于单个字符串匹配,AC自动机用于文章中匹配多个候选词。
流程
第一步,先将候选词先建立前缀树。
第二步,以宽度优先遍历的方式把前缀树的每个节点设置fail指针, 头节点的fail指针指向空, 头节点孩子的fail指针指向头, 其他节点的fail指针设置逻辑为:来到X节点的时候,是设置X的孩子的fail指针。
case 1:
假设X通过b指向了它的孩子,假设孩子为C,X的fail指针指向的节点假设为Y,Y有走向b的路,且Y走向b的路是指向的Z,那么 C的fail指针指向Z,Y没有走向b的路,那么就看Y的fail指针指向的节点的fail指针有没有走向b的路,依次往复,如果走到null都没有,那么进入case 2
case 2:
如果X的fail指针指向null,那么就把X的孩子C指向头节点
候选词构造AC自动机的一些示例,其中虚线表示节点fail指针的指向位置,黑色点表示候选词结尾位置。
示例一 ["abc","bkf","abcd","bkc"]

示例二 ["abcde","cde","e"]

示例三 ["abcde","bcde","cde","de","e"]

示例四 ["abcdef","cdef","ex"]

示例五 ["abcde","bcdf","cdtks"]

示例六 ["abc","abcde","abcd","bc","cd"]

示例七 ["abck","bct","st"]

fail指针的含义
假设要以这个字符结尾,哪一个另外的后缀串和其前缀串完全相等
假设["abcde","bcde","cde","de","e"],所以abcde中e的fail指针指向bcde中的e,因为以abcde中的e的后缀有bcde和候选词bcde的前缀匹配最长。
匹配规则
每次来到一个节点,根据fail指针转一圈,如果有描黑的点(结尾点)就收集答案,同时把结尾标志为已处理(防止重复收集),匹配失败的时候,要顺着fail指针蹦到另外一条路径上继续匹配。
举例
文章:"abcde"
候选词:["abc","abcde","abcd","bc","cd"]
流程:
第一步,先对候选词建立前缀树并连接好fail指针,建立好以后,如下图

第二步,文章的逐个位置进行匹配。来到第一个字符a, 前缀树中有走向a字符方向的路。如下图,走到2号点位置:

然后停在2号点位置,顺着fail指针走一圈,如果有黑色点(结束点)就收集答案。所以,在2号点位置,顺着fail指针走一圈分别要经过2号点,1号点,均不是结尾点,所以没有答案收集。然后再匹配文章的下一个字符b, 前缀树来到如下3号位置节点:

然后停在3号节点,顺着fail指针走一圈,分别会经历7号节点和1号节点,均不是结尾点,所以未收集到答案。
继续匹配文章下一个节点c,前缀树来到4号位置:

然后停在4号位置,顺着fail指针走一圈,分别经历了4号节点,8号节点,9号节点和1号节点,其中4号和8号是结尾点(表示abc的结尾和bc的结尾),所以收集到两个答案abc和bc。
继续匹配文章中的d字符,来到5号节点

然后停在5号节点上,顺着fail指针走一圈,会经历5,10,1号节点,5和10号节点分别是abcd和cd的结尾,所以收集到了abcd和cd两个答案。
最后来到文章最后一个节点e,即到6号点位置

停在6号点位置,顺着fail指针走,经过6号和1号,6号为abcde的结尾,所有收集到了abcde这个答案。
更多
参考资料
使用AC自动机解决文章匹配多个候选词问题的更多相关文章
- HDU 2846 (AC自动机+多文本匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2846 题目大意:有多个文本,多个模式串.问每个模式串中,有多少个文本?(匹配可重复) 解题思路: 传统 ...
- HDU:2222-Keywords Search(AC自动机模板,匹配模拟)
Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) P ...
- caioj1465&&poj1024: 【AC自动机】地图匹配
刷的第二题AC自动机,这题简直了.. 用询问的串建AC自动机,然后...爆搜! ACBB ACBBACCA A AABBC ...
- AC自动机处理多串匹配——cf1202E
si+sj中间有一个切割点,我们在t上枚举这个切割点i,即以t[i]作为最后一个字符时求有多少si可以匹配,以t[i+1]作为第一个字符时有多少sj可以匹配 那么对s串正着建一个ac自动机,反着建一个 ...
- hdu3065 病毒侵袭持续中 AC自动机入门题 N(N <= 1000)个长度不大于50的模式串(保证所有的模式串都不相同), 一个长度不大于2000000的待匹配串,求模式串在待匹配串中的出现次数。
/** 题目:hdu3065 病毒侵袭持续中 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3065 题意:N(N <= 1000)个长度不大于50的 ...
- hdu2896 病毒侵袭 AC自动机入门题 N(N <= 500)个长度不大于200的模式串(保证所有的模式串都不相同), M(M <= 1000)个长度不大于10000的待匹配串,问待匹配串中有哪几个模式串,
/** 题目:hdu2896 病毒侵袭 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2896 题意:N(N <= 500)个长度不大于200的模式串 ...
- AC自动机练习题1:地图匹配
AC自动机板子,学习之前要是忘记了就看一下 1465: [AC自动机]地图匹配 poj1204 时间限制: 1 Sec 内存限制: 256 MB提交: 78 解决: 46[提交] [状态] [讨论 ...
- hdoj 2222 Keywords Search(AC自动机)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222 思路分析:该问题为多模式匹配问题,使用AC自动机解决:需要注意的问题是如何统计该待查询的字符串包 ...
- Aho-Corasick automaton(AC自动机)解析及其在算法竞赛中的典型应用举例
摘要: 本文主要讲述了AC自动机的基本思想和实现原理,如何构造AC自动机,着重讲解AC自动机在算法竞赛中的一些典型应用. 什么是AC自动机? 如何构造一个AC自动机? AC自动机在算法竞赛中的典型应用 ...
随机推荐
- PostgreSQL执行计划的解析
一个顺序磁盘页面操作的cost值由系统参数seq_page_cost (floating point)参数指定的,由于这个参数默认为1.0,所以我们可以认为一次顺序磁盘页面操作的cost值为1.下面o ...
- Fancytree实例
一.实例 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> ...
- Windows10 Dev - Background Execution
The Universal Windows Platform (UWP) introduces new mechanisms, which allow the applications to perf ...
- 二、vue组件化开发(轻松入门vue)
轻松入门vue系列 Vue组件化开发 五.组件化开发 1. 组件注册 组件命名规范 组件注册注意事项 全局组件注册 局部组件注册 2. Vue调试工具下载 3. 组件间数据交互 父组件向子组件传值 p ...
- BootStrap学习代码
要为毕设做准备了! 哎,毕设前台得自己来,所以打算学学bootstrap,把学习的代码放到码云上面了,使用HbuilderX来写,界面友好,适合我这种前端小白- 第一天就感受到了写html快捷键的强大 ...
- 移动端常用单位——rem
移动端常用单位: ①px:像素大小,固定值 ②%:百分比 ③em(不常用,但是在首行缩进时可以使用):相对自身的font大小(当自身的字体大小也是em做单位时,才会以父元素的字体大小为基准单位) ④r ...
- 新东方APP技术架构演进, 分布式系统架构经验分享
今天的演讲题目是"新东方APP技术架构演进, C端技术经验分享" 作者:张建鑫, 曾任IBM高级软件架构师, 滴滴高级技术专家, 现任新东方集团高级技术总监 古代东西方的思想家都产 ...
- thymeleaf+layui加载页面渲染时报错
将freemaker替换成thymeleaf时出现以下问题: org.thymeleaf.exceptions.TemplateProcessingException: Could not parse ...
- 我的第一个npm包:wechat-menu-editor 基于Vue的微信自定义菜单编辑器
wechat-menu-editor 微信自定义菜单编辑器 前言 在做微信公众号相关开发时,基本上会去开发的功能就是微信自定义菜单设置的功能,本着不重复造轮子的原则,于是基于Vue封装的一个微信自定义 ...
- Mysql常用sql语句(10)- is null 空值查询
测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 is null是一个关键字来的,用于判断字段的值 ...