随笔分类 - 字符串算法 -- AC自动机
摘要:[BJOI2019]奥术神杖(分数规划,动态规划,AC自动机) 题面 "洛谷" 题解 首先乘法取$log$变加法,开$c$次根变成除$c$。 于是问题等价于最大化$\displaystyle \frac{\sum val_i}{c}$。典型的分数规划的形式。 二分权值$k$,每个点的点权变成$val
阅读全文
摘要:【BZOJ1559】[JSOI2009]密码(AC自动机,动态规划,搜索) 题面 "BZOJ" "洛谷" 题解 首先求方案数显然是构建$AC$自动机之后再状压$dp$,似乎没有什么好讲的。 现在考虑答案小于$42$的时候的怎么输出方案。 首先明白这样一点,如果一个位置可以不属于任何一个字符串而独立出
阅读全文
摘要:【BZOJ1444】[JSOI2009]有趣的游戏(高斯消元,AC自动机) 题面 "BZOJ" 题解 先把$AC$自动机构建出来,最好构成$Trie$图。然后这样子显然是在一个有向图中有一堆概率的转移,并且存在环,所以高斯消元解决。 cpp include include include using
阅读全文
摘要:【CF710F】String Set Queries(二进制分组,AC自动机) 题面 "洛谷" "CF" 翻译: 你有一个字符集合$D$,初始为空, 有三种操作: 往$D$中加入一个串;从$D$中删除一个串;给定一个串$S$,询问$D$中的串在$S$中总共出现了多少次。 题解 询问显然就是将$S$放
阅读全文
摘要:【BZOJ2754】喵星球上的点名(AC自动机) 题面 "BZOJ" 题解 友情提示:此题请不要在cogs上提交,它的数据有毒 对于点名串构建$AC$自动机 然后把名字丢进去进行匹配, 大力统计一下答案即可 当然,要用$map$记录$trie$树 cpp include include includ
阅读全文
摘要:【BZOJ1030】文本生成器(AC自动机,动态规划) 题面 "BZOJ" 题解 超级简单良心送分题 很明显是所有状态 不合法状态 合法状态就是$26^m$ 不合法状态做一个$dp$就好 cpp include include include include include include incl
阅读全文
摘要:【Luogu2444】病毒(AC自动机) 题面 "洛谷" 题解 如果存在一个无限长的串 证明可以在$AC$自动机上找到一个环 然后在上面可以无限跳 所以构建$AC$自动机 在上面跑$dfs$就好啦 cpp include include include include include include
阅读全文
摘要:【BZOJ2434】阿狸的打字机(AC自动机,树状数组) 先写个暴力: 每次打印出字符串后,就插入到$Trie$树中 搞完后直接搭$AC$自动机 看一看匹配是怎么样的: 每次沿着$AC$自动机走,在每一个节点都跳$fail$指针 如果有$x$串的末节点,就给答案$+1$ 这样的话没有必要存下每个串
阅读全文
摘要:【BZOJ3530】数数(AC自动机,动态规划) 题面 "BZOJ" 题解 很套路的$AC$自动机+$DP$ 首先,如果长度小于$N$ 就不存在任何限制 直接大力$DP$ 然后强制限制不能走到带有标记的点上面 如果长度恰好为$N$的长度 那么,要考虑是否恰好卡在范围里面 于是$DP$状态多记一维 表
阅读全文
摘要:【BZOJ1212】L语言(AC自动机) 题面 "BZOJ" 题解 很自然的,既然要匹配单词,那就全部都丢到$AC$自动机里面去 现在想想怎么匹配 先是$AC$自动机正常的匹配 如果此时这个位置能够匹配上一个串 我们就需要判断一下这个串覆盖到这个文本串中 它的前一位是否恰好被覆盖 如果有的话 我们也
阅读全文
摘要:【BZOJ3172】单词(AC自动机) 题面 Description 某人读论文,一篇论文是由许多单词组成。但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次。 Input 第一个一个整数N,表示有多少个单词,接下来N行每行一个单词。每个单词由小写字母组成,N inclu
阅读全文
摘要:题面 Description 农夫约翰为他的奶牛们购买了一份名字叫Good Hooveskeeping的定期杂志,因此奶牛们在挤奶期间就有了大量的阅读素材。遗憾的是在最新的一期上,有一篇有点儿不适当的文章,是关于如何烹饪完美的牛排。 FJ不想让她们看到那篇文章,(显然,这份杂志需要更好的编辑监督)。
阅读全文
摘要:"题面链接" 题解 首先构建出AC自动机 然后在AC自动机上面跑DP 转移很显然从Trie树的节点跳到他的儿子节点 但是要注意一个问题, 在计算的时候,每一个节点加入后能够 造成的贡献 要加上他的子串的贡献 至于DP: 设f[i][j]表示已经使用了i个字母 当前在Trie树的第j个节点上面能够产生
阅读全文