题目大意:给定两个字符串集合S和T,初始给定S集合中的所有字符串,不断向T集合中添加字符串,以及询问S集合中的某个字符串在T集合中的多少个字符串中出现过
神题- -
首先对S集合的所有字符串构建fail树
T集合中每加入一个字符串,我们就将这个字符串在AC自动机上跑一遍,并记录经过的所有节点
根据fail树的性质,这些节点到根路径上的所有节点的并集的出现次数都加了1
因此我们要求的就是树...
分类:
其他好文 时间:
2015-01-22 18:21:37
阅读次数:
345
这是一道神题。
首先我们需要建立AC自动机,然后再建个Fail树,之后发现
如果询问a串在b串中出现了几次,那么只需要看b串在AC自动机上所有的节点中有多少个节点,在a串的结束节点在Fail树上的子树中就可以了。
然后这样做就很可以了,但是仍然不能AC,
这时我们只需要按照Fail树的dfs序建立数据结构(我写了树状数组)进行区间查询就好了。
这时对于以上的b串,...
分类:
其他好文 时间:
2015-01-19 17:15:24
阅读次数:
128
题目链接:BZOJ - 3172题目分析: 题目要求求出每个单词出现的次数,如果把每个单词都在AC自动机里直接跑一遍,复杂度会很高。 这里使用AC自动机的“副产品”——Fail树,Fail树的一个性质是,一个字符串出现的次数,就等于以它的结点为根的Fail树中的子树中所有结点的 Cnt 和。 ...
分类:
其他好文 时间:
2014-12-10 20:59:41
阅读次数:
222
题目大意:有一种打字机上有28个字母,分别是26个小写字母和BP,其中B代表退格,P代表换行,每一行就是一个字符串。现在给这些字符串标号,并询问x串在y串中出现过几次。
思路:这算是NOI史上最难的字符串的题了吧(动物园)。
首先按照题意不难建一个AC自动机出来,按照正常的思路,对于每一个询问都需要在AC自动机上暴力的查找。但这样时间会十分好看。
于是我们想,fail指针构成的一定是...
分类:
其他好文 时间:
2014-12-10 16:24:22
阅读次数:
249
题目大意:在喵星球上有一些喵~,每个喵都有一个姓和一个名字。点名的时候如果一个喵中姓或者名中有这个串的话他就会喵。问每次点名有几个喵喵了,和每个喵喵了几次。
思路:好萌的题喵~
AC自动机构造fail树是可以做的,但是和SA乱搞的时间差不多,我就是SA乱搞的w
把所有的串(姓名,询问)用$连接成一个串,然后做后缀数组,height数组。过程中记录一下每一个后缀数属于哪个喵,还有询问在...
分类:
编程语言 时间:
2014-12-10 10:50:36
阅读次数:
229
题目大意:给定n个目标串和m个模式串,问这m个模式串每个在多少个目标串中出现过,以及n个目标串每个以最多多少个模式串为子串
我错了……就算用fail树+set启发式合并也优化不到O(nlog^2n)……这题的数据范围相当无解啊
首先将所有名字和点名的字符串全都插进AC自动机
将每个点上开一个set记录这个点是哪些喵星人的名字的前缀
然后建立fail树 沿着fail树从下到上启发式合并
每...
分类:
其他好文 时间:
2014-12-09 09:21:35
阅读次数:
286
题目大意及后缀数组做法见 http://blog.csdn.net/popoqqq/article/details/41042473
原来正解是fail树……难怪后缀数组被卡成这样
首先我们将给出的n个串构建AC自动机
朴素的做法是对于每个串将这个串每个节点沿着fail指针扫一遍,将路径上的所有点的cnt++
但是这样做会TLE
我们不妨反向思考 fail指针反向后是一棵树 沿着fail...
分类:
其他好文 时间:
2014-12-08 21:29:02
阅读次数:
203
题目大意:初始字串为空,首先给定一系列操作序列,有三种操作:
1.在结尾加一个字符
2.在结尾删除一个字符
3.打印当前字串
然后多次询问第x个打印的字串在第y个打印的字串中出现了几次
卡了很久……到底还是对AC自动机了解不是很深啊QAQ
fail树不是很难想 至少在用AC自动机切掉3172之后不是很难想……
首先构建AC自动机 注意由于这个字串的特殊构造 我们不必每打印一个字符串再...
分类:
编程语言 时间:
2014-11-26 19:08:19
阅读次数:
290