
AC自动机
YihAN_Z
ただのあほです
展开
-
HDU 2222 Keywords Search AC自动机
题目大意:有T组数据,每组数据中有n个模式串,给出一个主串,求出在主串中有多少个模式串出现过AC自动机裸题。AC自动机就是在Trie上做KMP,处理出在某位置失配后应该跳到什么位置,然后正常查询即可。 需要注意的是,还要处理一下不断地跳fail遇到第一个单词在什么位置,统计答案时也要统计一下。板子在这里。#include <cstdio>#include <cstring>#include <原创 2017-01-16 20:31:55 · 290 阅读 · 0 评论 -
BZOJ 1212 [HNOI2004] L语言 AC自动机+DP
题目大意:给出n个模式串,接着给出m个主串,求每个主串中的一个最长前缀使得其能被分割成若干个模式串。Trie树上暴力时间复杂度O(1M*10*20),过亿应该就很卡了吧…但是也能过,不过写AC自动机稳一点吧。设状态f(i)为长度为i的前缀是否能通过几个模式串表示出来。模式串建成AC自动机,结点上记录这个串的长度,用主串在上面跑,若匹配到了一个长度为j的串,则f(i) |= f(i-j).需要注意的是原创 2017-01-17 09:18:55 · 505 阅读 · 0 评论 -
BZOJ 1030 [JSOI2007] 文本生成器 AC自动机+DP
题目大意:给出n个模式串,给定m,表示将会随机生成长度为m的串,求出随机生成的串中,包含模式串的串的个数%10007的值若直接求包含模式串的串的个数,DP状态不好转移(可能在串的任意位置出现模式串,可能出现多个模式串,不方便统计方案数)。所以可以利用补集的思想,用总数减去不包含的串的个数即为答案。这样就方便设计状态了。设状态f(i,j)表示在自动机中的i号结点匹配了长度为j的串仍为出现模式串的方案数原创 2017-01-17 10:57:52 · 313 阅读 · 0 评论 -
BZOJ 3172 [Tjoi2013] 单词 Fail树
题目大意:给出n个单词,输出每个单词在所有单词中出现的次数。fail树真的是神奇…这里讲的还不错,可以看看(原来我写的AC自动机是Trie图)Fail树的一个性质是,某个结点对应的字符串肯定是其子树结点对应的字符串的后缀。这道题想找出每一个串在所有的串中匹配的次数,这时就可以利用fail树的这个性质,而且fail树也是建立在Trie上的,统计子树中所有结点个数,就代表其在所有串中的前缀中作为后缀出现原创 2017-01-17 16:13:43 · 487 阅读 · 0 评论 -
BZOJ 2434 [Noi2011] 阿狸的打字机 Fail树
2017.3.17补… 题目大意:造一台打字机(滑稽),要求支持:1.在末尾添加一个字符 2.删除结尾字符 3.打印当前字符串 4.回答打印出的第x个字符串在第y个字符串中出现了几次。询问一个字符串在另一个字符串中的出现次数可以想到利用AC自动机中构造出的Fail树的性质(类似BZOJ3172)。要如何回答询问呢?查询x在y中出现了几次,就是查询Fail树上x的子树中有多少个结点属于y.这样的话,原创 2017-01-17 19:55:20 · 413 阅读 · 2 评论