解决的问题

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的结尾),所以收集到两个答案abcbc

继续匹配文章中的d字符,来到5号节点

然后停在5号节点上,顺着fail指针走一圈,会经历5,10,1号节点,5和10号节点分别是abcdcd的结尾,所以收集到了abcdcd两个答案。

最后来到文章最后一个节点e,即到6号点位置

停在6号点位置,顺着fail指针走,经过6号和1号,6号为abcde的结尾,所有收集到了abcde这个答案。

更多

算法和数据结构笔记

参考资料

程序员代码面试指南(第2版)

算法和数据结构体系班-左程云

使用AC自动机解决文章匹配多个候选词问题的更多相关文章

  1. HDU 2846 (AC自动机+多文本匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2846 题目大意:有多个文本,多个模式串.问每个模式串中,有多少个文本?(匹配可重复) 解题思路: 传统 ...

  2. HDU:2222-Keywords Search(AC自动机模板,匹配模拟)

    Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) P ...

  3. caioj1465&&poj1024: 【AC自动机】地图匹配

    刷的第二题AC自动机,这题简直了.. 用询问的串建AC自动机,然后...爆搜! ACBB                  ACBBACCA                  A  AABBC     ...

  4. AC自动机处理多串匹配——cf1202E

    si+sj中间有一个切割点,我们在t上枚举这个切割点i,即以t[i]作为最后一个字符时求有多少si可以匹配,以t[i+1]作为第一个字符时有多少sj可以匹配 那么对s串正着建一个ac自动机,反着建一个 ...

  5. hdu3065 病毒侵袭持续中 AC自动机入门题 N(N <= 1000)个长度不大于50的模式串(保证所有的模式串都不相同), 一个长度不大于2000000的待匹配串,求模式串在待匹配串中的出现次数。

    /** 题目:hdu3065 病毒侵袭持续中 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3065 题意:N(N <= 1000)个长度不大于50的 ...

  6. hdu2896 病毒侵袭 AC自动机入门题 N(N <= 500)个长度不大于200的模式串(保证所有的模式串都不相同), M(M <= 1000)个长度不大于10000的待匹配串,问待匹配串中有哪几个模式串,

    /** 题目:hdu2896 病毒侵袭 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2896 题意:N(N <= 500)个长度不大于200的模式串 ...

  7. AC自动机练习题1:地图匹配

    AC自动机板子,学习之前要是忘记了就看一下 1465: [AC自动机]地图匹配 poj1204 时间限制: 1 Sec  内存限制: 256 MB提交: 78  解决: 46[提交] [状态] [讨论 ...

  8. hdoj 2222 Keywords Search(AC自动机)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222 思路分析:该问题为多模式匹配问题,使用AC自动机解决:需要注意的问题是如何统计该待查询的字符串包 ...

  9. Aho-Corasick automaton(AC自动机)解析及其在算法竞赛中的典型应用举例

    摘要: 本文主要讲述了AC自动机的基本思想和实现原理,如何构造AC自动机,着重讲解AC自动机在算法竞赛中的一些典型应用. 什么是AC自动机? 如何构造一个AC自动机? AC自动机在算法竞赛中的典型应用 ...

随机推荐

  1. 【java web】过滤器、拦截器、监听器的区别

    一.对比: 1.1 过滤器和拦截器的区别: ①拦截器是基于java的反射机制的,而过滤器是基于函数回调. ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器. ③拦截器只能对actio ...

  2. 关于Ubuntu18.04 linux系统下使用Tim QQ 微信

    先配上张图 步骤: 1.1 :需要安装环境deepin-wine 1.1:(你把他理解为jdk就好,没有jdk无法运行java程序,同理没有deepin-wine环境无法运行腾讯产品) 1.2 :去哪 ...

  3. 定位API的原理

    参考:0Day 安全 所有的win_32程序都会加载ntdll.dll和kerner32.dll这两个最基础的动态链接库.如果想要在win_32平台下定位kernel32.dll中的API地址 1,首 ...

  4. 统计MySQL数据库硬盘占用量大小

    select TABLE_NAME, concat(truncate(data_length/1024/1024,2),' MB') as data_size, concat(truncate(ind ...

  5. SpringSecurity入门

    基础 spring security的底层就是一个过滤器链 ExceptionTranslationFilter是一个异常过滤器,用来处理认证授权过程中的异常 UseranmePasswordAuth ...

  6. 国内Git官网下载windows版本慢的问题,推荐一个国内镜像

    话不多说了,给你们镜像地址: https://npm.taobao.org/mirrors/git-for-windows/ 不用谢.点右边打赏个一毛钱,告诉我你来过        !_!

  7. linux centos7 df命令

    2021-08-04 1. df 命令简介 linux 中 df 命令的功能是用来检查 linux 服务器的文件系统的磁盘空间占用情况.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信 ...

  8. 两种github action 打包.Net Core 项目docker镜像推送到阿里云镜像仓库

    两种github action 打包.Net Core 项目docker镜像推送到阿里云镜像仓库 1.GitHub Actions 是什么? 大家知道,持续集成由很多操作组成,比如抓取代码.运行测试. ...

  9. Docker容器编排工具——docker-compose

    1.docker-compose介绍 2.使用的三个步骤 3.安装docker-compose yum install docker-compose 4.docker-compose.yml 文件 ( ...

  10. Python常见问题 - python3 requests库提示警告InsecureRequestWarning的问题

    当使用 requests 库发送请求时报了以下警告 D:\python3.6\lib\site-packages\urllib3\connectionpool.py:847: InsecureRequ ...