字符串-AC自动机
Endless_Way
这个作者很懒,什么都没留下…
展开
-
HDU 2222 Keywords Search
AC自动机模板题233333#include<queue> #include<cstdio> #include<cstring> using namespace std; char word[55], s[1000010]; struct node { node *next[26], *fail; int cnt; node() { cnt=0;原创 2016-08-04 14:11:51 · 209 阅读 · 0 评论 -
BZOJ 1030 [JSOI2007]文本生成器
AC自动机+DP。这题和POJ2778神似。不同的是本题要求包含字串,而那POJ那一题要求不包含。发现只要m一定,总数量是一定的,为26m26^m。于是正难则反- -,用总数量减去不包含任何串的数量。这题节点太多(最坏情况上千个),不能用矩阵做,于是DP。记f[i][j]表示以i节点为起点,长度为j的合法字符串方案数,往儿子DP即可。#include<cstdio> #include<queue>原创 2016-08-24 13:43:08 · 292 阅读 · 0 评论 -
POJ 2778 DNA Sequence
刚开始学习AC自动机,就碰到这样一道题- -,揣摩了好一会儿才弄清楚题解的意思orz题目要求找出由A,C,T,G构成的长度为n,且不包含给出的子串的字符串数量。先建trie树。发现如果对答案串进行AC自动机处理,处理过程中的指针一定不会碰到给出的子串的末节点。用一个矩阵mat[i][j],记下从i节点转移一次到达j节点的方案数。使不能到达的节点,即给出的子串的末节点不统计进mat矩阵。那么最终答案就原创 2016-08-04 17:46:55 · 269 阅读 · 0 评论 -
BZOJ 2754 [SCOI2012]喵星球上的点名
AC自动机对每一个询问串建AC自动机,拿每一个名字跑AC自动机,不断在fail指针上统计答案即可。因为字符串总长度有保证,时间复杂度可以近似看成O(LEN)。刚开始比较SB,每一个trie节点都开了一个next[10000],结果MLE了。实际上每个节点根本用不到这么多,可以改成map。做fail指针的时候不用从1扫到10000来找子节点,因为子节点并没有那么多,可以把子节点的编号用vector记录原创 2016-09-27 13:56:05 · 359 阅读 · 0 评论 -
BZOJ 3881 [Coci2015]Divljak
AC自动机+fail树+树链求并+树状数组挺复杂的一道题。看到这题的第一反应是把S里的穿全都丢到AC自动机里,然后对于T中的每一个串在AC自动机上走,走到每一个节点时暴力往回跳fail来贡献答案所有。由于fail指针可能有很多,应该是可以卡到O(n^2)的,过不了吧。我们发现每一次贡献答案都是沿着fail边往上的,于是考虑用fail树来考虑。每一次一个节点贡献答案想到于该节点到根的路径全都贡献答案。原创 2016-12-17 18:13:48 · 1008 阅读 · 0 评论 -
BZOJ 2553 [BeiJing2011]禁忌
AC自动机+矩阵快速幂刚开始是想记f表示走到这的概率,g表示走到这的期望答案。写了一下狂WA不止,估计是计算量太大掉精度了?然后发现g实际上没有什么用。#include<cstdio> #include<cstring> #define S 28 #define L 20 #define N 150 using namespace std; namespace runzhe2000 { ty原创 2017-03-27 15:45:03 · 360 阅读 · 0 评论