[Alg] 文本匹配-多模匹配-AC自动机】的更多相关文章

1. 简介 AC自动机是一种多模匹配的文本匹配算法. 如果采用naive的方法,即依次比较文本串s中是否包含模式串p1, p2,...非常耗时.考虑到这些模式串中可能具有相同子串,可以利用已经比较过的那些模式串的一些信息,来优化效率.容易想到的一种方法是为这些模式串构建一个trie树,可以较好的利用模式串的公共前缀信息. 但是如果只是采用普通的trie树,仍有 如果一个模式串P1不匹配,就要重新回到根节点再找下一个模式串P2,也就是对于下一个模式串P2,要从P2的起始元素开始,依次与文本串S比较…
题目链接 题目大意:给定$n$个子串,要求构造一个长度为$m$的母串使得至少有一个子串是其子串.问方案数. ------------------------ 我们可以对要求进行转化:求出不合法的方案数,总方案数减去不合法的方案数即为合法方案数. 首先建一个AC自动机,对于每个串的末尾结点及其$fail$边指向的结点都打上标记,表示遍历AC自动机的时候不经过这些点(因为如果一个串是另一个串的后缀,显然这两个串都是合法的). 然后就可以大力DP了.设$f[i][j]$表示走了$i$步到达$j$结点的…
首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一.一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过.要搞懂AC自动机,先得有模式树(字典树)Trie和KMP模式匹配算法的基础知识.KMP算法是单模式串的字符匹配算法,AC自动机是多模式串的字符匹配算法. AC自动机和字典树的关系比较大,所以先来简单的了解下字典树Trie. 字典树又称单词查找树,Trie树,是一种…
首先,有这样一道题: 给你一个单词W和一个文章T,问W在T中出现了几次(原题见POJ3461). OK,so easy~ HASH or KMP 轻松解决. 那么还有一道例题: 给定n个长度不超过50的由小写英文字母组成的单词准备查询,以及一篇长为m的文章,问:文中出现了多少个待查询的单词(原题见POJ3630). OK,依然so easy~ 字典树(Trie)轻松解决. 那么,如果你说,什么是KMP和Trie,那么恭喜你啊…… 建议大家要在看这篇博客之前做到: 如果你能看到这里,说明你已经熟练…
题目描述 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. 输入 第一行是一个正整数n(n<=12),表示给定的字符串的个数. 以下的n行,每行有一个全由大写字母组成的字符串.每个字符串的长度不超过50. 输出 只有一行,为找到的最短的字符串T.在保证最短的前提下, 如果有多个字符串都满足要求,那么必须输出按字典序排列的第一个. 样例输入 2 ABCD BCDABC 样例输出 ABCDABC   题意是找一个最短的母串包含…
题意:给你几个keywords,再给你一段文章,问你keywords出现了几次. 思路:这里就要用到多模匹配算法AC自动机了,AC自动机需要KMP和字典树的知识,匹配时是在字典树上,失配我们就要用到类似KMP的失配值了,如果失配,我们就沿着失配值到某个节点开始匹配,因为是多模匹配,我们每次失配移动都会从某一keyword的某部分开始匹配,这样就节省了很多时间. 话说第一次听到AC自动机我竟天真的以为是会自动AC题目的算法...orz 参考: AC自动机算法详解 (转载) ac自动机最详细的讲解,…
layout: post title: 「kuangbin带你飞」专题十七 AC自动机 author: "luowentaoaa" catalog: true tags: - kuangbin - 字符串 - AC自动机 传送门 A.HDU2222 Keywords Search 模板题.给出N个单词,后给你一个长串,问长串中有几个单词. #include<bits/stdc++.h> using namespace std; typedef long long ll; c…
题面 传送门 正文 最暴力的 最暴力的方法:把所有询问代表的字符串跑一遍kmp然后输出 稍微优化一下:把所有询问保存起来,把模板串相同的合并,求出next然后匹配 但是这两种方法本质没有区别,都是暴力 不那么暴力的 我们对于所有的串建立一个AC自动机,把询问按照$y$排序,然后在AC自动机上面跑,每次跳fail更新答案 这样可以拿到70分,但是时间上限还是会$O\left(n^2\right)$左右 巧妙的优化 这道题里面,所有的模板串和文本串都在AC自动机里 那么,题目中实际是在要求什么呢?…
[题目链接] https://loj.ac/problem/10058 [题意] 对于每一段文字,其前缀在母串上的最大匹配长度是多少呢 [参考别人的题解] https://www.luogu.org/problemnew/solution/P5231 我们只需要先建立所有密码的trie树再以母串为主串跑一个AC自动机不过其中还是有一些需要改动的地方原本字典树中用来记录某个节点是不是字符串结尾的数组不需要,直接删去我们需要另一个数组来标记哪些点被匹配跑完ac自动机后从trie树上找最后一个匹配的点…
虽然 NOIp 原地爆炸了,目前进入 AFO 状态,但感觉省选还是要冲一把,所以现在又来开始颓字符串辣 首先先复习一个很早很早就学过但忘记的算法--自动 AC AC自动机. AC 自动机能够在 \(\mathcal O(\sum|s|)\) 的时间内解决多模式串的问题,你可以理解为它把 KMP 放在了 trie 树上. 举个例子,\(S=\{"abc","bcd","cd"\},T="abcdbc"\). 首先建出 trie…
AC自动机 转载自:小白 还可参考:飘过的小牛 1.KMP算法: a. 传统字符串的匹配和KMP: 对于字符串S = ”abcabcabdabba”,T = ”abcabd”,如果用T去匹配S下划线部分是当前已经匹配好的前缀,当c和d不匹配时: S:abcabcabdabba            T:abcabd 传统的算法是将T串向后移动一个单位,然后重新匹配.如果利用KMP算法则直接将T向后移动3位,即: S:abcabcabdabba            T:       abcabd…
实现功能——输入N,M,提供一个共计N个单词的词典,然后在最后输入的M个字符串中进行多串匹配(关于AC自动机算法,此处不再赘述,详见:Aho-Corasick 多模式匹配算法.AC自动机详解.考虑到有时候字典会相当稀疏,所以引入了chi和bro指针进行优化——其原理比较类似于邻接表,这个东西和next数组本质上是一致的,只是chi和bro用于遍历某一节点下的子节点,next用于查询某节点下是否有需要的子节点) type point=^node; node=record ex:longint;st…
http://acm.hdu.edu.cn/showproblem.php?pid=3065 需要记录匹配情况的AC自动机,没有清空一些数组导致wa了几发. /*--------------------------------------------------------------------------------------*/ // Helica's header // Second Editions // 2015.11.7 // #include <algorithm> #inc…
正解:AC自动机 解题报告: 传送门! 啊我好呆啊其实就挺模板题的,,,只是要一个栈搞一下,,,然后我就不会了,,,是看了题解才get的,,,QAQ 然后写下解法趴QwQ 首先看到多串匹配不难想到AC自动机?问题只是在于删了某个字符串之后怎么继续匹配下去嘛QwQ 然后我就卡这儿了QAQ 正解其实并不难想到,,,就可以开一个栈,记录一路上经过的ac自动机上的节点的编号,然后每次删了一个串之后把now跳到这个串的前一位的那个编号位置就好 补充一个恶心的小细节,,, 就是这题不输出换行会莫名其妙WA在…
刚学了ac自动机,去hzwer上找了道练习题: 串是安全的就说明ac自动机不会找到匹配,考虑ac自动机的匹配过程: 我们把val等于1的点删掉和fail指针指向被删掉的点删掉: 如果剩下的图有环,就有解: #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; ; int tot,v…
blog:www.wjyyy.top     AC自动机是一种毒瘤的方便的多模式串匹配算法.基于字典树,用到了类似KMP的思维.     AC自动机与KMP不同的是,AC自动机可以同时匹配多个模式串,而复杂度不会达到太高.如果用KMP多次匹配字符串,复杂度就是\(O(k(n+m))\).     我们知道,如果让一个字符串头对头或者完全匹配其他字符串,用字典树来匹配是最为方便的.但是如果匹配过程中发现当前节点没有目标儿子,就发生了失配.在KMP字符串匹配中,失配可以跳到给当前位置预处理出的nxt…
题目链接 BZOJ1559 题解 考虑到这是一个包含子串的问题,而且子串非常少,我们考虑\(AC\)自动机上的状压\(dp\) 设\(f[i][j][s]\)表示长度为\(i\)的串,匹配到了\(AC\)自动机\(j\)号节点,且已匹配集合为\(s\)的方案数 直接在\(AC\)自动机上转移即可 但是为了防止使用\(last\)指针之类的,计算匹配的串,我们先将原串的集合去重和去包含关系 方案怎么办? 考虑到\(ans \le 42\),一定是刚好若干个原串以最长前后缀相同的方式相接 因为如果不…
什么是AC自动机? 百度百科 Aho-Corasick automaton,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法. 要学会AC自动机,我们必须知道什么是Trie,也就是字典树.Trie树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. AC自动机有什么作用? 快速寻找多个字串与原串的关系,是多个字符串的kmp匹配算法 怎么实现AC自动机? ①trie字典树部分 这里只…
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1009 题意: 准考证号为\(n\)位数\(X_1X_2....X_n(0<=X_i<=9)\),你不希望准考证号上出现不吉利的数字. 不吉利数字\(A_1A_2...A_m(0<=A_i<=9)\)有\(m\)位,不出现是指\(X_1X_2...X_n\) 中没有恰好一段等于\(A_1A_2...A_m\).\(A_1\) 和 \(X_1\) 都可以为\(0\). 问你…
理解的不够深 故只能以此来加深理解 .我这个人就是蠢没办法 学长讲的题全程蒙蔽.可能我字符串就是菜吧,哦不我这个人就是菜吧. AC自动机的名字 AC 取自一个大牛 而自动机就比较有讲究了 不是寻常的东西呢. 自动机由5部分组成 1 字符集 2 状态集合 3 初始状态 4 结束状态集合 5 状态转移函数. 字符集 是指自动机字符的集合. 当然以上有点深奥,我们只需要其能识别字符串即可. 显然的是 KMP做单字符串对单字符串的匹配使用 而AC自动机则是多个字符串在一个字符串上的匹配. 构建trie…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2846 题目大意:有多个文本,多个模式串.问每个模式串中,有多少个文本?(匹配可重复) 解题思路: 传统AC自动机是计算单个文本中,模式串出现次数. 这里比较特殊,每个文本需要单独计算,而且每个匹配在每个文本中只能计数1次. 比如add,d只能计数1次,而不是:两次. 所以循环逐个对文本Find.每个Find里,进行Hash,保证每个匹配串只计数1次. 由于匹配串可重复,在Insert之前,也需要离散…
实际场景: 网站的用户发了一些帖子S1, S2,...,网站就要审核一下这些帖子里有没有敏感词. 1. 如果网站想查一下帖子里有没有一个敏感词P,这个文本匹配要怎么做更快? 2. 如果网站想查一下帖子里有没有敏感词P1, P2,...,这个文本匹配要怎么做更快? 单模匹配与多模匹配 从以上的实际场景中,可以抽象出来两类文本匹配的问题.这里首先将"帖子"抽象为待匹配的序列S,将"敏感词"抽象为模式串P.那目标就是看看序列S中是否包含模式串P. 如果模式串P只有一个,要…
(并不能自动AC) 介绍: Aho-Corasick automaton,最经典的处理多个模式串的匹配问题. 是kmp和字典树的结合. 精髓与灵魂: ①利用trie处理多个模式串 ②引入fail指针.节点x的fail表示,trie中最大的某个前缀等于x到根节点字符串后缀的节点位置. fail类比于kmp的nxt数组,可以在失配的时候,O(1)找到最大的可能能继续匹配的位置. 所以,ac自动机可看做多个kmp 步骤:(完整代码在下面) ①建trie树.插入模式串. void ins(char *s…
2772: 关键词匹配 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 10  Solved: 4[Submit][Status][Web Board] Description 给你N个单词,然后给定一个字符串,问一共有多少单词在这个字符串中出现过(输入相同的字符串算不同的单词,同一个单词重复出现只计一次). Input 第一行一个整数N,表示给定单词的个数.接下来N行,每行输入一个长度不超过50且全由小写字母组成的单词.最后一行输入一个长度不超过1…
/** 题目:hdu3065 病毒侵袭持续中 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3065 题意:N(N <= 1000)个长度不大于50的模式串(保证所有的模式串都不相同), 一个长度不大于2000000的待匹配串,求模式串在待匹配串中的出现次数. 思路:ac自动机做发,val标记每一个病毒串编号,通过print函数统计每一个病毒出现的次数. AC自动机好文章:http://www.cppblog.com/menjitianya/archi…
/** 题目:hdu2896 病毒侵袭 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2896 题意:N(N <= 500)个长度不大于200的模式串(保证所有的模式串都不相同), M(M <= 1000)个长度不大于10000的待匹配串,问待匹配串中有哪几个模式串, 题目保证每个待匹配串中最多有三个模式串. 思路:ac自动机做法,字符为可见字符,那么直接就是他们的ascii值作为每一个字符的标志.最多128: 由于不超过三个,所以找到3个就可以re…
首先可以对n个目标串单独进行处理. 对于每个目标串,考虑把模式串按'*'进行划分为cnt段.首尾两段一定得于原串进行匹配.剩下的cnt-2段尽量与最靠左的起点进行匹配. 对于剩下的cnt-2段.每段又可以通过‘?’划分为k个子串.对每个子串求出hash值.然后通过枚举起点与目标串的某个区间的hash进行判断. 就可以在O(k)的时间进行每一次的枚举了.对于目标串区间的hash值.可以通过预处理hash前缀进行O(1)询问. 而最多进行len次枚举.所以总复杂度为O(n*len*k). 另外判断子…
Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Problem Description In the modern time, Search engine came into the life of everybody like Google, Baidu, etc. Wiskey also wants to bring this feature…
刷的第二题AC自动机,这题简直了.. 用询问的串建AC自动机,然后...爆搜! ACBB                  ACBBACCA                  A  AABBC        ——〉     A  CACBA                  ACBA 像这样,将最外面的每一个点将有可能的方向走,比如第一行第一列的A向东南走,就可以得到一个ACBA的串,然后像模板题一样,去匹配找就行了.(老实讲我还是觉得这个很不靠谱..谁叫人家地图小..) 小细节,我将查询的字符…
AC自动机板子,学习之前要是忘记了就看一下 1465: [AC自动机]地图匹配 poj1204 时间限制: 1 Sec  内存限制: 256 MB提交: 78  解决: 46[提交] [状态] [讨论版] [命题人:admin] 题目描述 [题意] 给出有一个L*C的字符地图,地图的行与列都从0开始编号然后给出一些字符串,求出这些字符串在字符地图上第一次出现的坐标输出字符串第一个字母的坐标和字符串的方向字符串的方向是指字符串的走向A表示正北,B表示东北,C表示正东,D表示东南,E表示正南,F表示…