
AC自动机
Loi_a
这个作者很懒,什么都没留下…
展开
-
HDU 2222 Keywords Search AC自动机
存个模板。#include<iostream>#include<cstdio>#include<queue>#include<cstring>#define SZ 500005using namespace std;struct Trie{ int val[SZ],ch[SZ][30],tot; int fail[SZ],lst[SZ]; void insert(原创 2016-10-16 11:19:54 · 354 阅读 · 0 评论 -
bzoj 3172 单词 AC自动机
fail 树:一个点只有一个fail指针,所以把fail边倒过来就变成了一个树的结构。一个字符串出现在其他串中,当它是其他串一个后缀的前缀,例如abc出现在aaabcdd中,当它是abcdd这个后缀的前缀。所以需要算一下有多少fail直接或间接指向它最后一个字母c(fail树中 c子孙的大小),就可以算出abc是多少个后缀的前缀,也就可以算出它在整个文本中出现了多少次。 AC自动机建完后,用栈存f原创 2016-10-16 19:13:43 · 527 阅读 · 0 评论 -
bzoj 2434 阿狸的打字机 AC自动机+fail树
询问x串在y串中出现次数,就是有多少y串的节点能顺着fail边跑到x的终止节点。所以建出fail树,求end[x] 为根的子树中有多少y的节点。 这个可以离线询问,用树状数组维护。#include<queue>#include<vector>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#de原创 2017-04-13 17:31:46 · 424 阅读 · 0 评论 -
bzoj 1030 文本生成器 AC自动机+DP
答案=方案总数-不合法总数; 设AC自动机上非法节点为终止节点(或fail指针指向终止节点的点) dp[ i ] [ j ]为当前在AC自动机上跑了 i 步 ,跑到 j 节点的方案数,其中过程不经过非法节点。 不合法方案数=sigma(dp[ m ] [ i ])其中 i 不是为合法节点。#include<queue>#include<cstdio>#include<cstring>#i原创 2017-04-13 18:36:04 · 396 阅读 · 0 评论 -
bzoj 2938 病毒 AC自动机
在补全之后的AC自动机上顺着child找环而不经过终止节点,如果存在环,则说明我们可以顺着这条路径构造无限长的字符串。#include<queue>#include<cstdio>#include<cstring>#include<iostream>#define maxn 100005using namespace std;char s[maxn];struct Trie{原创 2017-04-13 18:42:01 · 643 阅读 · 0 评论 -
bzoj 2553 禁忌 AC自动机+期望DP
先考虑一个串A如何划分价值最大,只需要按照所有T串在A中匹配的右端点排个序贪心去选,也就是希望我在A中匹配i个禁忌串,最靠后的右端点应该尽量靠前。 在AC自动机上对应为:只要走到一个禁忌串的终止节点,就将它划分出一段,(这里的终止节点包括那些顺着fail指针能走到终止节点的点)。 可以设dp[ i ][ j ]为在AC自动机上走了i步,走到了j节点的概率。 dp[ i ] [ ch[j][k]原创 2017-04-15 06:57:08 · 628 阅读 · 0 评论 -
bzoj 3940 & 3942 KMP || AC自动机
3942题解: 定义f[i] 为S串以第i位结尾的后缀,最长可以是T串多长的前缀,这一个可以用KMP匹配。 可以用一个first数组记录i字符前一个未被匹配的位置是哪一个,当f[i]=len(T)时,就可以将最末尾的len(T)个字符匹配了。 3940只需要把KMP换为AC自动机就可以。3942:#include<cstdio>#include<cstring>#include<iostr原创 2017-04-15 07:15:27 · 493 阅读 · 0 评论