首先对所有单词建立AC自动机,$S$是$T$的子串等价于$T$的某个前缀通过$fail$链可以走到$S$的终止节点,即$S$的终止节点是$T$某个前缀在$fail$树上的祖先。设$f[i]$表示考虑了前$i$个单词,且第$i$个单词必选时子序列价值的最大值,则$f[i]=\max(单词i每个前缀的贡...
分类:
其他好文 时间:
2016-01-12 19:21:44
阅读次数:
217
fail树上建可持久化树。根据原题中给定的输入跑就可以跑出一颗trie树,然后对这个trie数建fail树。我最开始的思路错了:A串在B串中出现的次数就是看B中有多少节点可以直接或者说间接的指向A的子树。举个反例:A = aaa,设A的子树是一个点为b,B = aaab,那么B将会有两个指针指向A的...
分类:
其他好文 时间:
2015-12-28 11:54:36
阅读次数:
173
将输入的Trie建成AC自动机,并建出fail树。那么操作1等价于在给定点的子树的并集里都加1。操作2等价于查询给定点到根节点路径的并集的权值和。求出DFS序后,对于操作1,将点按进入时间戳从小到大排序,然后求出并集,进行区间修改即可。对于操作2,构造给定点集的虚树,在虚树的每一条边上询问权值和,累...
分类:
其他好文 时间:
2015-10-06 01:53:08
阅读次数:
252
3172: [Tjoi2013]单词
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 1890 Solved: 877
[Submit][Status][Discuss]
Description
某人读论文,一篇论文是由许多单词组成。但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次。
Input
...
分类:
编程语言 时间:
2015-08-27 18:50:12
阅读次数:
387
BZOJ 3172 [Tjoi2013]单词 AC自动机(fail树)...
分类:
其他好文 时间:
2015-07-08 16:41:24
阅读次数:
164
Description阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机。打字机上只有28个按键,分别印有26个小写英文字母和'B'、'P'两个字母。 经阿狸研究发现,这个打字机是这样工作的:l 输入小写字母,打字机的一个凹槽中会加入这个字母(这个字母加在凹槽的最后)。l 按一下印有'B'的...
分类:
其他好文 时间:
2015-06-07 12:23:33
阅读次数:
165
这题真是太神了,好多实用的技巧。。首先肯定是要先把每个要输出的串当模式串把自动机给建出来的,如果一个一个串复制出来再一个个插入显然非常慢。。。我们用在自动机上插入模式串的方法来建,初始时在0,新加一个字符就想下爬(或者新建),维护一个父亲指针,删除的时候就可以爬上去,这样就可以O(n)建出来了。。
再考虑询问的问题,每次把串拿出来再放进自动机跑一遍显然太慢。。这里需要用到一个叫做fail树的东西...
分类:
编程语言 时间:
2015-04-20 09:36:29
阅读次数:
455
AC自动机 Orz zyf 玛雅一开始连题意都没看懂……意思就是给你一篇文章的N个单词,问每个单词在这篇文章中各出现了几次?(这篇文章=N个单词) 那么我们建个AC自动机……对于每个单词来说,它出现的次数=以它为根的fail树的大小,即询问有多少点沿fail指针能走到这个单词的结束结点。 但...
分类:
其他好文 时间:
2015-04-06 23:08:10
阅读次数:
259
Trie树/可持久化线段树 神题啊……搞了我一下午= =(其实第233个提交也是我的) 我一开始的思路:这个找kpm串的过程,其实就跟在AC自动机上沿fail倒着往下走是差不多的(看当前是哪些点的后缀,如果某个串的后缀是当前串,那它的fail就会指向这里)所以就在fail树上bfs一遍,然后找到.....
分类:
其他好文 时间:
2015-04-05 21:41:44
阅读次数:
302