AC自动机
DOFYPXY
这个作者很懒,什么都没留下…
展开
-
[BZOJ1030] 文本生成器 AC自动机+DP
我好菜啊。。。都是抄了std后再去理解的。。。 补集思想,先求出所有不可读的,在减去即可。 f[i,j]表示在AC自动机上走i步到达j点构成单词的方案数。首先要把所有是单词结尾的点标记出来,是不能走的,而且沿着fail树能走到单词末尾的点也是不能走的,这个在建AC自动机的时候顺便处理一下。然后可以对AC自动机做一个小处理,如果trie[i,c]=0(不存在)那么就把trie[fail[i],c]原创 2017-04-22 08:33:23 · 405 阅读 · 0 评论 -
[BZOJ3530][SDOI2014]数数 AC自动机+数位DP
考虑先建出集合S的AC自动机,并把它补成Trie图(是叫这个吗?),并在AC自动机标记上S集合中每个数字的结束位置。把这个标记沿fail树下传之后,一个串只要在AC自动机上没有走到标记点,就说明它是幸运数. 所以考虑数位DP,设f[i][j][0/1]f[i][j][0/1]表示从高往低填到第ii位,跑到AC自动机上jj点,前ii位<N<N还是=N=N。转移即可。 考虑到不能有前导零,所以填每一原创 2017-12-31 10:59:31 · 302 阅读 · 0 评论 -
[2018雅礼集训1-4]字符串 AC自动机+状压DP
题面 其实我的写法有些复杂。。。 考虑一个反对称串TT前mm位确定,后mm位也唯一确定了,就是翻转之后再01取反。所以给定的一个串要在TT中出现过,要么是前半部分的子串,要么是后半部分的子串(等价于翻转之后再01取反后是前半部分的子串),要么经过中间。 先考虑前两种情况,想到建出AC自动机再状压DP,我们从第mm位往前DP,AC自动机上要建出每个给定串ss的翻转串和01取反串,并打上该串的标原创 2018-01-04 21:34:08 · 453 阅读 · 0 评论 -
[2018雅礼集训1-16]背单词 AC自动机+二进制分组
题面 大概就是用栈维护logn\log n个AC自动机,每次新加入一个单词就新建一个AC自动机,当栈顶的自动机和栈顶下一个自动机包含单词个数相同的时候就暴力重构合并。 一个单词最多被合并log\log次,然后查询的时候也只会跑log\log个自动机,所以复杂度是O(nlog|t|+|s|logn)O(n\log |t|+|s|\log n)的。其实还带个2626的常数,不过跑得挺快的。。。原创 2018-01-17 22:41:19 · 604 阅读 · 0 评论