
AC自动机
Duan2baka
人
展开
-
BZOJ[1195][HNOI2006]最短母串 AC自动机+状态压缩
传送门ber~AC自动机多记录一个state" role="presentation" style="position: relative;">statestatestate表示这个点代表的状态 把所有串插进AC自动机里,串i" role="presentation" style="position: relative;">iii的末尾的state" role="presentation"原创 2018-01-24 14:43:53 · 786 阅读 · 3 评论 -
BZOJ[4327]JSOI2012 玄武密码 AC自动机
题目链接将每个字串插入AC自动机中,用主串上去匹配,每个走过的点x都是主串的一个前缀因为一个点的Fail一定是它的后缀,这样沿着x的Fail一直向上爬就可以标记出每一个出现的子串(前缀的后缀,就是原串的一个字串),遇见标记过的就停止,这样保证每个点只被走一次插入子串时,记录每个子串的结束位置,统计时沿着每个字串的结束点一直向上爬,找到第一个被标记的点就是最长的前缀 注意这里的向上爬的意思是向上爬树原创 2017-12-27 15:00:45 · 579 阅读 · 0 评论 -
BZOJ[1030][JSOI2007]文本生成器 AC自动机+dp
题目链接http://www.lydsy.com/JudgeOnline/problem.php?id=1030统计所有能匹配到这些串的, 将串的总数(26m26^m)减去匹配不到的就可以统计了 建完AC自动机后,将所有危险点标记,在AC自动机上dp fi,jf_{i,j}表示匹配j个字母后到AC自动机上的点i上,不与危险串匹配的方案有多少 如果i和他的儿子x都不危险,那么fx,j+1=fi原创 2017-12-22 20:37:49 · 321 阅读 · 0 评论 -
BZOJ2938[Poi2000]病毒 AC自动机
题目链接http://www.lydsy.com/JudgeOnline/problem.php?id=2938发现一个合法的串一定不会与病毒串匹配 如果让它无限长,就说明一直匹配不到病毒串 如果找到一个不经过病毒点的环,那么就存在无限长度的合法串 AC自动机建完图后,再用dfs判断即可代码如下:#include<cstring>#include<ctype.h>#include<cstd原创 2017-12-21 21:28:03 · 427 阅读 · 0 评论 -
BZOJ[3940][Usaco2015 Feb]Censoring(Gold) AC自动机
传送门ber~拿栈维护原串 如果AC自动机上跑到一个位置能匹配某个子串,就让top" style="position: relative;" tabindex="0" id="MathJax-Element-7-Frame" class="MathJax">toptoptop减去这个子串的长度 接着该从哪里匹配呢? 再开一个栈维护即可Trie图的nex" style="positio原创 2018-02-05 15:17:47 · 384 阅读 · 0 评论 -
BZOJ[3172][Tjoi2013]单词 Fail树
传送门ber~先将所有的串建一个AC自动机,构建的Fail时候到一个点就将它所有的Fail都加上1 emmmm…TLE….这时就要用到Fail树 将所有Fail指针反向,就可以弄出一个树一样的东西,可以发现,一个点一定是它子树点的后缀(如果串s能匹配到这里,s就会是子树所有点的后缀)弱鸡说不明白了还是看这个吧QAQ “这道题想找出每一个串在所有的串中匹配的次数,这时就可以利用fa原创 2018-02-06 09:26:58 · 320 阅读 · 0 评论 -
BZOJ[3075][Usaco2013]Necklace AC自动机+dp
传送门ber~要让B不是A的子串,换句话说,就是不让A匹配到头(跑到AC自动机的最下面) 令fi,jfi,jf_{i,j}表示串上的位置iii匹配到树上的结点jjj最大长度(A串前iii个字符中最多选多少个字符正好匹配到节点jjj) 每步可走可不走,走的话就+1,不走就直接转移 注意不能走到头(代表可以匹配了)代码如下:#include<cstring>#inclu...原创 2018-03-08 10:14:27 · 423 阅读 · 0 评论