这道题利用了fail树的神奇性质————父节点为其子节点的前缀 先对Alice的集合建一个fail树, Bob每插入一个串,都将串在自动机上经过的点在树上打上标记(+1) 每次查询的答案就是询问串的结束节点的子树的贡献 所以还需要用到树状数组来维护dfs序 因为Bob的一个串至多只能对Alice的某 ...
分类:
编程语言 时间:
2018-11-26 17:31:47
阅读次数:
250
建议大家学过AC自动机之后再来看这篇小结 fail树就是讲fail指针看做一条边连成的树形结构 fail指针在AC自动机中的含义是指以x为结尾的后缀在其他模式串中所能匹配的最长前缀的长度 所以在模式串中一定有sq[1~fa[x]]为sk[1~x]的子串 这个性质可以解决一些问题: 单词 显然,我们在 ...
分类:
其他好文 时间:
2018-10-19 14:23:47
阅读次数:
357
题解:先建pam,然后在fail树上dfs,从上到下的链如果有当前长度最远回文串的一半,那么更新答案 // pragma GCC optimize(2) // pragma GCC optimize(3) // pragma GCC optimize(4) // pragma GCC optimiz ...
分类:
其他好文 时间:
2018-10-04 11:00:53
阅读次数:
162
题目链接 "51nod 1277 字符串中的最大值" 题解 对于单串,考虑多串的fail树,发现next数组的关系形成树形结构 建出next树,对于每一个前缀,他出现的次数就是他子树的大小 代码 c++ include include include inline int read() { int ...
分类:
其他好文 时间:
2018-08-22 22:50:54
阅读次数:
210
题目链接 "bzoj3172: [Tjoi2013]单词" 题解 在插入单词时对于每个点都标记一下 构建fail树 因为AC自动机节点维护前缀,fail树的关系是公共后缀,那么可以发现,答案就是该单词的fail子树总价值 代码 c++ include include include include ...
分类:
其他好文 时间:
2018-07-05 21:37:15
阅读次数:
160
总结一下自己的心得体会,不讲算法。。 AC自动机 AC自动机即Trie+KMP?是解决多模式串匹配的一种算法 它的构造方式如下: 注意:在一般的匹配问题中,我们会把trie树补为trie图,虽然这样会极大的降低匹配时间,但是当利用的$fail$树中各节点相对位置(例如lca)的时候不建议这么做 性质 ...
分类:
其他好文 时间:
2018-07-02 18:44:23
阅读次数:
179
题面 "传送门" 正文 最暴力的 最暴力的方法:把所有询问代表的字符串跑一遍kmp然后输出 稍微优化一下:把所有询问保存起来,把模板串相同的合并,求出next然后匹配 但是这两种方法本质没有区别,都是暴力 不那么暴力的 我们对于所有的串建立一个AC自动机,把询问按照$y$排序,然后在AC自动机上面跑 ...
分类:
编程语言 时间:
2018-04-22 16:09:16
阅读次数:
240
题面 "传送门" 思路 首先,我们观察一下这个要求的“模板串”,发现它有如下性质: 1.一个模板串$A$是要求的文本串$B$的公共前后缀 2.如果一个模板串$A$有另一个模板串$B$(也就是$B$可以覆盖A),那么$B$是比$A$更优的一个解 3.如果模板串$A$可以完全覆盖文本串$B$,那么$A$ ...
分类:
其他好文 时间:
2018-04-21 21:21:17
阅读次数:
168
Description 不稳定的传送门 某人读论文,一篇论文是由许多单词组成。但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次。单词个数<=200,单词总长度<=10^6 Solution AC自动机的入门题,将所有单词建一颗字典树,并构造fail树 然后随便统计一下数 ...
分类:
其他好文 时间:
2018-04-21 17:37:44
阅读次数:
143
AC自动机 简单谈谈。 图懒得放了。 其实就是一个\(Trie\)树+\(fail\)树的结合体。 \(fail\)指针可以视为指向自己在\(Trie\)树上存在的最长严格后缀(不是本身) 为了方便转移,可以将AC自动机改造 即 if(!son[e][i]) son[e][i] = son[fail ...
分类:
其他好文 时间:
2018-04-20 22:01:41
阅读次数:
117