随笔分类 - 字符串-AC自动机
摘要:题目 "P4045 [JSOI2009]密码" 做法 AC自动机+状压+爆搜 建AC自动机是显然的,顺便预处理$lst_i$表示$i$结点以哪些串结束(二进制) 然后跑状压$dp[i][j][k]$表$i$长度现在在$j$结点已经出现的串$k$,理解:自由结点则由根节点$0$传递 毒瘤的地方在于输出
阅读全文
摘要:题目 "CF710F String Set Queries" 做法 很好的题目(AC自动机) 支持三种操作:插入,删除,查询 删除很好做,再建个自动机然后差分就行了 题目难点主要是插入,对于每个新来的串都重构,T是肯定的 这题我们用二进制来解决,对于插入和删除建多个自动机,然后查询时累加所属的多个自
阅读全文
摘要:题目 "P2292 [HNOI2004]L语言" 化简题目:多个匹配串,多个文本串,求文本串恰好被匹配串拼接的最长前缀 做法 显然我们对文本串建AC自动机,然后标记末节点 建$tire$图,需要注意的是:末节点标记不能下传,原因在于对文本串跑差分的操作,自己想想吧 多于每个文本串跑$trie$图,对
阅读全文
摘要:$fail$指针:指向最长的在$tire$里出现的后缀 比$tire$多出来的子边:原来的$tire$,我们失配后又得返回根结点再次匹配,而加入这些边后只需要花$strlen(s)$就能实现所有匹配 跑$tire$图:能跑到一个结点,该结点所代表的串能被文本串表示 例题 问题1:多个模式串,一个文本
阅读全文
摘要:题目 "P2444 [POI2000]病毒" 做法 我们要找出无限安全字符串,则是这段字符串没有任意一点作为危险字符串的末点 我们对所有危险的字符串建AC自动机,然后跑一遍$trie$图,然后暴力判断是否有环,有环则说明存在无限安全字符串 My complete code cpp include i
阅读全文
摘要:题目 "P2414 [NOI2011]阿狸的打字机" 做法 显然跟处理字符串有关,但具体用什么呢? 一次打印有可能会打印之前重复过的,当然是$trie$,之后查询作为子串出现过几次,看看前面的$trie$,当然用$trie$图了 先考虑暴力,$y$所在串的每个字符跳$fail$是否能到$x$的末尾
阅读全文
摘要:"P3715 [BJOI2017]魔法咒语" 用基本词汇组成$L$长度的单词,其中不能包含禁忌词汇 用禁忌词汇建强大的$tire$图 解决: 分类讨论,$L include using namespace std; typedef long long LL; const LL maxn=1010;
阅读全文
摘要:"P3311 [SDOI2014]数数" 看到匹配,自然想到AC自动机 控制位数的当然容易做,$emmm$ 这里是要求小于$n$,后面不会了怎么办 好像和数位dp有点关系,首先$dp1_{i,j}$跑一边,小于$strlen(n)$长度的个数 重点来了,$dp2_{i,j,1/0}$ 第三维表示是否
阅读全文
摘要:"P3041 [USACO12JAN]视频游戏的连击Video Game Combos" 看到匹配,当然用AC自动机 常我们有文本串,这里仅给出长度,怎么计算得分呢 按模式串建自动机,跑一边$dp$,字符集较小,都不需要统计每个点的值 直接往上扫累加就行 My complete code: cpp
阅读全文