AC自动机
Wuliwuliii
谁无暴风劲雨时,守得云开见日明!
展开
-
【模板】AC自动机(加强版)【AC自动机fail树上求最多出现次数】
题目链接 P3796 给出N个模式串,然后我们用一个文本串去进行匹配,这样的做法,就是AC自动机了,于是乎,我们可以先将N个模式串丢进去,然后建立fail树,然后先对所有的节点求出最大串在文本串中出现的次数,然后利用dfs跑fail树的办法,我们可以O(N)的求解这个问题。#include <iostream>#include <cstdio>#include <cmath>#include <string>#include <cst.原创 2020-09-22 16:43:23 · 275 阅读 · 0 评论 -
[COCI2015]Divljak【AC自动机+fail树+LCA】
题目链接 P5840给一组比较强的样例(我刚好是过了这个才过的):3aabacc21 aabacc2 2ans:1然后,讲一下思维的过程: 刚看到这个问题的时候,卡在了怎样去处理“访问到仅能算一次”,而不是“访问到几次就算几次”。大白话的意思就是“aaaaaa”里有6个“a”,但是我们只能对“a”算一次,所以,返回到fail树上去。 现在看到fail树,我...原创 2020-01-08 09:57:01 · 267 阅读 · 0 评论 -
[NOI2011]阿狸的打字机【AC自动机fail树+树状数组】
题目链接 P2414 题目给出N个字符串,我们现在想知道的是第x个字符串在第y个字符串中出现的次数是多少次? 求每个字符在其余字符中出现次数,想到从AC自动机上走,其实可以看作是求它的后缀的前缀中有多少个是满足的,换言之,我们可以去fail树中的父亲结点中查询。就譬如说对于aa和aabaa两个字符串,我们搭建字典树 并且对应上fail指针,我们可以知道,aa出现的次数为两...原创 2020-01-07 18:18:43 · 240 阅读 · 0 评论 -
Tree-String Problem 【CodeForces - 291E】【AC自动机】
题目链接 题意:给你N个点的树,树上的边的权值是一个自上往下的字符串,然后我们再给出一个字符串,是模式串,我们现在想知道模式串在树上的出现次数,譬如说样例。 我们查找的是aba,它在1——4这条链上出现了2次,在1——5上出现1次,在2——3上出现2次,在2——6上出现1次。 思路:我们可以直接建模式串的字典树,然后先赋值上价值1,然后后面我们只需要在AC自动机上知道价值1出...原创 2020-01-07 09:37:08 · 358 阅读 · 2 评论 -
Searching the String 【ZOJ - 3228】【AC自动机+last跳板优化时间】
题目链接 这次要求的有两个,分别是0、1,代表着的是可以重叠,以及不可以重叠的遍历到该单词的次数,可以重叠的很容易,遇到的时候,就直接加上就是了,但是不可以重叠的时候呢,就需要看到该单词它和上一次的状态出现的距离差了,看一下是否比这个单词长即可。 然后我看了一下这个,就想到需要不断的向前fail,但是由于可能fail的无效次数太多,所以就用了last跳板,但是最后发现只优化了100+m...原创 2019-03-11 22:15:34 · 316 阅读 · 0 评论 -
Ring 【HDU - 2296】【AC自动机+静态+DP】
题目链接之前写的题解报告,第二次写了,多了些理解了——能再多给点AC吗?不止是题目…… 有段时间没有去碰AC自动机了,于是乎写了这道题(其实是放松一下心态之用的,最近好多的大起大落……QAQ) 无非就是在这道题的时候,注意一下,重叠也是有效的,所以要考虑到重合的情况,也就是下推fail指针的时候,要去注意重叠的部分,向上加就是了。 然后就是一个DP[长度][状态(自动机...原创 2019-03-11 17:11:53 · 188 阅读 · 0 评论 -
Wireless Password 【HDU - 2825】【AC自动机+状压DP】
题目链接 好题一道,推了一会,然后计算了一下时间复杂度,差不多最坏情况是25*100*1024*26=66560000然后看了下,嗯,能搞,有搞头哈哈哈,然后写了一下,首先……WA了,发现竟然是最大极限哪儿写错了,我的个天呐!A! 我们看到最多也就是10个单词,那么不如状压这十个单词吧,然后就从这十个单词开始做文章,我们不断的推状态,每个单词的尾记下它的状压状态,然后记得build_f...原创 2019-02-09 22:01:30 · 165 阅读 · 0 评论 -
Ring 【HDU - 2296】【AC自动机+DP】
题目链接 问的是可以包含情况下的最大的匹配,就是譬如说"vve"可以覆盖"v"、"ve"的值,所以是值的叠加,求最后的最大值的最小长度,如果长度相等就是去取最小字典序。 思路:可还真是捣腾的难呀,弄了一下午终于dubug出来的了,没想到竟然是建立fail指针的时候出了少许错误,哎……那么,怎么去解这道题?毕竟要输出答案的字符串,所以我还去补了下下"strcpy()"、"strcmp()...原创 2019-02-08 16:52:40 · 210 阅读 · 0 评论 -
DNA repair 【HDU - 2457】【AC自动机+DP思路】
题目链接 开始肝这道题的时候也是冒了十足的勇气……呜呜呜,当时一直没发现,我有个地方写成了"s[i] - 'A'",怎么能这样用啊!毕竟只有A、C、G、T的说……呜呜呜…… QAQ 然后讲一下,这道题的AC自动机的想法,还有DP的思路(我DP超菜…… 能过也是超神了……),我们在这用AC自动机来做的是去取状态,那么怎么取状态?我们先按照普遍的写法(AC自动机上建满路,下一步到达A、C、...原创 2019-01-23 16:18:30 · 201 阅读 · 0 评论 -
Remember the Word 【UVALive - 394】【AC自动机 + DP】
题目链接 很多人用了Trie图去做了这道题,或许那个做法确实会快得多,但是,我却想到了在AC自动机上写了个DP,与2018四川省赛(第十届四川省ACM)那道题一样,甚至还要略微简单一些,这道题就敲出来了,它不用记录路径,直接输出最后的解即可,嗯……好题。嘤嘤嘤……#include <iostream>#include <cstdio>#include <...原创 2019-01-22 10:16:57 · 211 阅读 · 0 评论 -
Clannad【2018四川省赛】【AC自动机 + DP】
题目链接(第十届四川省赛C题) 挺好的一道题,就是要做一个last优化,每次的last要返回到之前的有值节点,也就是单词的尾的对应节点,然后就不会超时了…… 呜呜呜,之前一直超时,以为是初始化的memset()问题,以前被卡过memset(),然后发现其实要是有多个相同的节点,岂不是会反复无常的跑无用的fail指针,于是就用了last优化掉了,过了。过咯! 对了,用DP推状态,这个比划...原创 2019-01-21 22:02:24 · 400 阅读 · 5 评论 -
DNA Sequence 【POJ - 2778】【AC自动机+矩阵快速幂】
题目链接 哇哇哇!!!过啦,美滋滋,捋了半天题意,不解为何最后答案为0,然后就一直一直的debug,后来发现竟然是在写字典树的时候写彪了……呜呜呜,好气啊QAQ…… 题目的思路倒也却是很有奥妙,也特别的有意思(尤其是想到之后),我们看到有长达"2e9"的步数得去走,就想到了用矩阵快速幂,[i][j]指的是从i到j所需要的路径可能的数量。然后,我们找到N步之后的所有从[0]状态到达的全体...原创 2019-01-20 16:07:00 · 223 阅读 · 0 评论 -
病毒侵袭持续中 【HDU - 3065】【AC自动机】
题目链接 就是求的是每个病毒出现的次数,可以重叠……嗯,最后别忘了释放内存,不然听说会MLE(但是我比较规矩……不会遇到这种现象的,MLE了一次,就记得要释放内存了)。 是一道AC自动机的模板题。#include <iostream>#include <cstdio>#include <cmath>#include <string&...原创 2019-01-19 20:53:29 · 139 阅读 · 0 评论 -
Matrix Matcher【UVA 11019】【AC自动机】
题目链接 嗯……一开始没有想到会有可能存在等区间字符串的重叠问题,然后WA了几发,后来举了这组样例,想到了,可能会有相等的值却是在不同的位置上,但是由于在字典树上会被相互覆盖,所以,我就建了一个vector<>来存:给出该组样例:14 4abbabaabababbaba2 2ababans:1 然后,我就把题给过了,美滋滋,但作为AC自动机的初学者...原创 2019-01-19 20:15:32 · 160 阅读 · 0 评论 -
病毒侵袭 【HDU - 2896】【AC自动机】
题目链接 开动态字典树外带内存释放,卡过C++,再多一丢丢都要MLE的那种哦……还是很爽的! 这道题与这一道题不同就不同在不能去减,能用的就都要用上,然后就直接输出就是了,美滋滋……一开始还是写错了些,忘记给used[]数组初始化,然后有些地方没有写上"->fail",然后找了两个小时BUG,最后,惊险!过了,就好。#include <iostream>#in...原创 2019-01-19 16:26:41 · 124 阅读 · 0 评论 -
Keywords Search 【HDU - 2222】【AC自动机模板】
题目链接 学习AC自动机的第一道题(可能跟广大学友是一样的),让我知道了什么是AC自动机。 具体讲一下吧,它就是用来求多串匹配的(而KMP只是求单串匹配的,相当于是在KMP上做了优化)。之后,就是怎么构造AC自动机了,知道它就是在一棵字典树上做文章,我们先对所要查询的字符串作字典树的建立,并且,在每个字符串的尾,也就是每个字符串的尾部在字典树上的值附上"+1",若是能查到这一步,就说明...原创 2019-01-19 14:43:14 · 192 阅读 · 0 评论