字典树 简介:字典树,又称单词查找树,Trie树,是一种树形结构,是哈希树的变种. 优点:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较. 性质:根节点不包含字符,除根节点外每一个节点都只包含一个字符: 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串: 每个节点的所有子节点包含的字符都不相同. 操作: 记trie[i][j]表示第i个节点的第j个儿子为哪个节点,tot为总的节点个数 插入: void insert() { int len = strlen(…
基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value = None self.children = {} # children is of type {char, Node} self.fre = 0 self.father = None self.fail = None def CMP(a, b): return b.fre - a.fre cla…
个人认为trie,KMP,AC自动机是思想非常明确的,AC自动机的性质是与KMP算法的思想类似的(失配后跳转) 而KMP是线性的,AC自动机是在tire树上跑KMP,为方便那些不会用指针的小朋友(我也不会....) 我的tire树,kmp算法的next,AC自动机的fail全是用数组实现的!!!!(还有谁???!!!) 所以 上板子 1.KMP 2.TRIE 3.AC自动机 void make() { nxt[1]=0; for(int i=2; i<=len1; i++) { int j=nx…
题目大意:略 由于字符集大,要用map维护Trie树 并不能用AC自动机的Trie图优化,不然内存会炸 所以我用AC自动机暴跳fail水过的 显然根据喵星人建AC自动机是不行的,所以要根据问题建 然而这题有一些很艮的地方: 1.如果一个喵的名和姓都被点到,那他只被点到了一次 2.询问的串可能相同 3.如果map中并不包含某个元素,但你强行用数组表示它,那么它会返回0,然后这个元素会被强行插入map并赋值成0 #include <map> #include <queue> #incl…
题目大意: 输入 n 个目标单词和一个文本串,判断文本串中是否存在某些目标单词. 思路 赤裸裸的 AC自动机. 代码: #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<queue> #include<algorithm> #include<cmath> #include<map> using nam…
题目大意:略 裸的AC自动机+数位DP吧... 定义f[i][x][0/1]表示已经匹配到了第i位,当前位置是x,0表示没到上限,1到上限,此时数是数量 然而会出现虚拟前导零,即前几位没有数字的情况,实际上是在0号节点原地打转,所以多加一维状态,再额外讨论第1位就行了 #include <cmath> #include <queue> #include <vector> #include <cstdio> #include <cstring> #…
题目分析: 画一下fail树,就会发现就是x的子树中属于y路径的,把y剖分一下,用线段树处理 $O(n*log^2 n)$. 代码: #include<bits/stdc++.h> using namespace std; ; string str; ],fail,fa;}T[maxn]; ,snum,m; int dfsin[maxn],dfsout[maxn],poss[maxn]; // failtree int Tnb[maxn],top[maxn],sz[maxn]; vector…
题目大意:给你$N$个长度相等且互不相同的模式串,现在有一个字符串生成器会不断生成字符,其中每个字符出现的概率是$p_{i}/q_{i}$,当生成器生成的字符串包含了某个模式串,则拥有该模式串的玩家胜利,然后游戏立即结束,求每个玩家获胜的概率 $N<=10$ 首先建出$Trie$图 接着设$f[i]$表示匹配时停在i的概率,可得$f[ch{k}]+=f[i]*p_{k}/q_{k}$ 由于$N$很小,可以构建$dp$转移的邻接矩阵,由于生成器生成的串是无限长的,相当于把矩阵乘了无限次幂 可以耍赖…
题意:给定n个模式串和一个文本串,判断文本中是否存在模式串. 思路:套模板即可. AC代码 #include <cstdio> #include <cmath> #include <cctype> #include <bitset> #include <algorithm> #include <cstring> #include <utility> #include <string> #include <…
blog:www.wjyyy.top     AC自动机是一种毒瘤的方便的多模式串匹配算法.基于字典树,用到了类似KMP的思维.     AC自动机与KMP不同的是,AC自动机可以同时匹配多个模式串,而复杂度不会达到太高.如果用KMP多次匹配字符串,复杂度就是\(O(k(n+m))\).     我们知道,如果让一个字符串头对头或者完全匹配其他字符串,用字典树来匹配是最为方便的.但是如果匹配过程中发现当前节点没有目标儿子,就发生了失配.在KMP字符串匹配中,失配可以跳到给当前位置预处理出的nxt…