[一本通学习笔记] AC自动机】的更多相关文章

AC自动机可以看作是在Trie树上建立了fail指针,在这里可以看作fail链.如果u的fail链指向v,那么v的对应串一定是u对应串在所给定字符串集合的后缀集合中的最长的后缀. 我们考虑一下如何实现这个东西. 以上数组实现的过程中我们让0号结点充当了根,这样会省去很多边界的处理. 我们考虑如何用指针去实现AC自动机,这看起来要更加自然.在指针实现的过程中,为了严谨起见,我们定义:节点的ch指针在默认情况下为NULL,fail指针在默认情况下为root(根节点自身除外) 这样的话就更加严格,各种…
最先开始以为和自动刷题机是一个东西... 其实就是kmp的一个拓展.学完kmp再学这个就会发现其实不难 1.kmp是一个串匹配一个串,但是当我们想用多个串匹配一个文本的时候,kmp就不行了,因此我们有了AC自动机 2.很明显我们用单词去匹配文本是肯定要一个一个枚举单词去匹配的,那么我们换个思路,用文本去匹配串. 3.AC自动机的原理:我不是很懂,口胡一下: 1.建立一颗trie,读入单词后把单词一个一个插入到trie 3.进行文本匹配.把文本放到AC自动机上.想象一下:把AC自动机的root看成…
形势所迫,一个对字符串深恶痛绝的鸽子又来更新了. SAM 后缀自动机就是一个对于字符串所有后缀所建立起的自动机.一些优良的性质可以使其完成很多字符串的问题. 其核心主要在于每个节点的状态和$endpos$这个概念的结合:"状态"定义为从源点出发到达当前节点的所有字符串,$endpos$对于一个字符串它作为整个字符串子串的末尾的集合,而SAM则保证状态和相同的$endpos$集合构成一个一一映射. 容易证明在同一个状态的字符串互为后缀,记最长的那个为$longest(x)$,但是不保证所…
好抽象啊,早上看了两个多小时才看懂,\(\%\%\%Fading\) 早就懂了 讲解就算了吧--可以去看看其他人的博客 1.[模板]后缀自动机 \(siz\) 为该串出现的次数,\(l\) 为子串长度,每次乘一下就好了 \(Code\ Below:\) #include <bits/stdc++.h> #define ll long long using namespace std; const int maxn=2000000+10; int n,a[maxn],c[maxn],last,c…
本节内容过于暴力没什么好说的.借着这个专题改掉写倍增的陋习,虽然写链剖代码长了点不过常数小还是很香. 10130. 「一本通 4.4 例 1」点的距离 #include <bits/stdc++.h> using namespace std; const int N = 1000005; namespace tree { int n; vector<int> g[N]; int top[N], wson[N], dep[N], siz[N], vis[N], fa[N], dfn[…
傻傻地敲了好多遍ST表. 10119. 「一本通 4.2 例 1」数列区间最大值 #include <bits/stdc++.h> using namespace std; const int N = 1000005; struct st { int a[N][21]; void build(int *src, int n) { for (int i = 1; i <= n; i++) a[i][0] = src[i]; for (int i = 1; i <= 20; i++)…
字典树中根到每个结点对应原串集合的一个前缀,这个前缀由路径上所有转移边对应的字母构成.我们可以对每个结点维护一些需要的信息,这样即可以去做很多事情. #10049. 「一本通 2.3 例 1」Phone List #include <bits/stdc++.h> using namespace std; namespace Trie { struct Node { Node *ch[]; int val; Node* clear() { ;i<;i++) ch[i]=NULL; val=…
KMP算法 对于串s[1..n],我们定义fail[i]表示以串s[1..i]的最长公共真前后缀. 我们首先考虑对于模式串p,如何计算出它的fail数组.定义fail[0]=-1. 根据“真前后缀”的条件,容易得到fail[1]=0 对于任意的i>1,显然在s[fail[i-1]+1]==s[i]的时候,我们有fail[i]=fail[i-1] 如果s[fail[i-1]+1]!=s[i],那么我们需要去尝试s[fail[fail[i-1]]+1]是否与s[i]相等,否则再继续下去. 这是因为我…
这章对现在的我来说有点难,要是不写点东西,三天后怕是就一无所有了. 但写这个没有营养的blog的目的真的不是做题或提升,只是学习学习代码和理解一些概念. 现在对AC自动机的理解还十分浅薄,这里先贴上目前我看过的文章: 深入理解Aho-Corasick自动机算法 AC 自动机学习笔记 AC自动机相比Trie多了失配边,结点到结点间的状态转移,结点到根的状态转移. 这里fail的定义是:使当前字符失配时跳转到另一段从root开始每一个字符都与当前已匹配字符段某一个后缀完全相同且长度最大的位置继续匹配…
题目大意:输入几个子串,然后输入一个母串,问在母串里面包含几个子串.   分析:刚学习的AC自动机,据说这是个最基础的模板题,所以也是用了最基本的写法来完成的,当然也借鉴了别人的代码思想,确实是个很神奇的东西,如果不懂KMP的话,最好先学学KMP再来学这个,会理解的更深刻一些.   代码如下: ======================================================================================================…