
字符串—ac自动机
文章平均质量分 80
My_ACM_Dream
生活没有彩排每天都是现场直播
展开
-
AC自动机
终于可以学习AC自动机,一直觉得这个东西很神秘,参照了大神的讲解和bin神的代码,算是理解了ac自动机的原理了,其实就是多模式串的匹配,一些处理的方法都十分的巧妙,写这个算其实可以参照kmp的next回溯,这样理解会更透彻。大神讲解 bin神struct AC{ int next[500005][26],fail[500005],end[500005],Q[500005];原创 2015-02-23 13:56:06 · 478 阅读 · 0 评论 -
poj 2778 DNA Sequence (ac自动机+矩阵加速)
题意:计算不包含病毒串的串的个数,长度n题解:没法用dp啊。矩阵加速,这个应用了矩阵的性质。矩阵n次幂,对应的点ij表示i经过n个节点到j路径的个数。被各种卡时间啊,结果发现是自己的矩阵乘法写残了。#include#include#include#include#include#include#include#include#includeusing name原创 2015-02-27 17:10:00 · 611 阅读 · 0 评论 -
hdu 2243 考研路茫茫——单词情结 (ac自动机+矩阵优化)
题意:这题简直是个奇葩的题目。题目各处n个串,然后要求长度小与等于n且包含着n个串至少一个串的串的个数。题解:首先我们构造一个字典图节点个数的矩阵,这样可以求出长度等于L不包含n个串的个数,那么把之前的矩阵看成一个部分,这样求 { f[n] , 1 } = { f[n-1] , 1 } *{ 原矩阵 0 ; 1 1 }这样就可以求出不包含且小于等于的个数,然后用总数-这个就得出了原创 2015-02-28 15:57:02 · 605 阅读 · 0 评论 -
SPOJ 1676 Text Generator (ac自动机+矩阵优化)
题意:给出n个单词,求这些单词能组成的文章个数,文章的单词数L个。题解:各种TL,一个黑色的晚上。不知道为什么,自己写的矩阵乘法异常的慢,从类改成写简陋的C格式,都TL了,发现是取模太多次的缘故,于是改成加完在摸,结果wa了,坑爹,然后改成longlong TL了,简直无情啊。最后用了无符号int即不会爆int也不像longlong那么耗费时间。于是就过了。。。。#include#i原创 2015-03-02 20:21:00 · 653 阅读 · 0 评论 -
poj 1204 Word Puzzles (ac自动机)
题意:给出一个字符串矩阵,n个单词,要求n个单词去匹配这个矩阵,单词可以出现矩阵任意位置,可以斜着,横着,竖着。求出每个单词的首字母在矩阵中的位置,以及方向。题解:枚举起点,和方向,在矩阵中暴力匹配。#include#include#include#include#include#include#include#include#includeusing names原创 2015-03-02 13:39:39 · 558 阅读 · 0 评论 -
HUNAN 11187 Emoticons :-) (ac自动机+贪心)
题意:给出n个表情串,现在给出一篇txt,要求将txt对应的字母改成空格使得txt不包含如何表情串。求最小操作数。题解:dp肯定挂,无论是内存或者时间的消耗都挂。那么就要思考下能否用贪心做。根据大犇,我也学着证明一下,对于这样的文章,如果出现表情串,那么有一下几种情况:1、各个表情串单独的分开,这个好说,直接碰到匹配ans++;2、如果两个或多个重叠,比如a,b,c重叠原创 2015-03-03 00:47:30 · 735 阅读 · 0 评论 -
hdu 3962 Microgene (ac自动机+矩阵优化(好题))
题意:给出n个串,现在要求长度为L的串至少包含着n个串中的两个串的个数。题解:一看这种计数类问题要么dp,要么矩阵乘法。dp明显内存时间都爆。那么可以考虑用矩阵乘法,首先如果直接用矩阵存不包含任意n个字符串,L次幂,将maze[0][i]相加得到长度为L的不包含任何n个串对应串的个数,然后在计算全部的情况,这样就缺包含一个字符串对应串的个数这个方案了,之前用枚举N个字符串哪个出现了进行原创 2015-03-03 19:38:38 · 635 阅读 · 0 评论 -
hdu 5164 Matching on Array (奇葩版ac自动机)
题意:给出一个a序列,m个b序列,a能通过倍数关系能出现多少b串。例如a{ 2 4 8 } b{ 1 2 } 那么a中的{ 2 4 } 和{ 4 8 } 是可以通过b序列通过倍数变成的。题解:我们可以把串进行缩放,然后缩放后的串进行匹配。对于m==1的情况用kmp 其他情况用ac自动机。搞一个分数类进行处理。自动机的边用map,对奇葩的地方就是这里,用map做边,map>next原创 2015-03-03 23:07:13 · 567 阅读 · 0 评论 -
zoj 3535 Gao the String II (ac自动机+dp)
题意:给出A集合有m个穿,B集合有n个串,现在要求A集合中的串进行组合成长度不超过L的串S,是的包含最多B集合的串。题解:这题真心orz。dp[i][j][k]表示长度为i,在ac自动机上的状态j,并且是以k为结尾的A中的串。预处理出每个A集合中的串和其他A集合中的串拼接的长度,因为任何两个串拼接的长度可以有多个,所以暴力枚举拼接的长度然后判断是否可行。注意:空串可以拼接任何串在开原创 2015-03-03 16:13:48 · 779 阅读 · 0 评论 -
hdu 2457 DNA repair (ac自动机+dp)
题意:给出n个非法的串,然后给出一个目标串,问如何改变目标串使得用最少步数让目标串不包含非法串。题解:dp[i][j]第i个字母结尾点在节点j处的最小处理操作。ac自动机上的dp很难解释,我也能意会,功力不够。大概就是字典图上的转移方程,将字典图与目标串进行匹配dp。注意fail指针的修改,这算是最难理解的部分。#include#include#include#inc原创 2015-02-25 13:51:50 · 613 阅读 · 0 评论 -
hdu 3247 Resource Archiver (ac自动机+BFS+状压dp)
题意:给出n个资源串,m个病毒串,现在要如何连接资源串使得不含病毒串(可以重叠)。题解:真心不会做。这题注意点好多,稍不留意就wa。看了题解我是这样理解的,我么可以把资源串和病毒串都放到ac机上,这样的做是为了把病毒串挑掉。在建ac机时,通过判断fail指针对应节点是否是病毒串,然后将fail指针的内容根性到这个节点。同理对于资源串也用相同方法。我们这样设置标记,病毒串ID=-原创 2015-02-25 21:31:58 · 552 阅读 · 0 评论 -
hdu 2896 病毒侵袭 (ac自动机)
题意:给出n个病毒串,然后给出m个网站的串,问每个网站中有哪些 病毒出现并输出,最后统计有有病毒的网站数量。题解:ac自动机,end记录某个病毒的编号。突发奇想用set去存每个网站的病毒,这样既可以去重有可以递增输出,而且set绝对比自己手写的方法快毕竟logn的复杂度。#include#include#include#include#include#includ原创 2015-02-23 14:42:42 · 420 阅读 · 0 评论 -
hdu 2222 Keywords Search (ac自动机入门题)
题意:在目标串种找出单词出现的种类数。题解:直接搞。#include#include#include#include#include#include#include#includeusing namespace std;#define B(x) (1<<(x))typedef long long ll;const int oo=0x3f3f3f3f;cons原创 2015-02-23 14:46:02 · 594 阅读 · 0 评论 -
poj 1625 Censored! (ac自动机+dp)
题意:一个神奇的国度他们字母类型有n个,并且每句话必须是m个字母组成的,但是国王很奇葩,他设定了一些单词,只要句子中出现这样的单词那么造句的人就好入狱。给出了p个不能出现的单词。问有多少种句子可以出现。题解:ac自动上的dp,第一次做参照了bin神的代码,很神奇啊,ac自动机上也可以dp 0 0!好了我以自己理解来分析这题。首先,我们要将所给的n个字符进行处理,因为这n个字符有原创 2015-02-23 20:46:14 · 585 阅读 · 0 评论 -
zoj 3228 Searching the String (ac自动机)
题意:给出一个目标串,已经一些单词,每个单词有一个限制,0表示找到目标串中包含重叠部分出现的次数,1相反。可以有多个相同的单词。题解:如果直接kmp 复杂度O(n^2)超时。那么可以考虑ac自动,将单词存入字典树整体匹配。最蛋疼的是多个单词重复是允许的。那么我们要存对应编号的单词在字典树中的位置这样输出处理都方便只要处理字典树上的对应节点即可。对于不可以重叠的单词的计数,添加一个数原创 2015-02-25 15:19:51 · 541 阅读 · 0 评论 -
zoj 3494 BCD Code (ac自动机+数位dp)
题意:给出n个非法串,给出一个范围,求这个范围的数转成定义串不包含非法的个数。所谓定义串,举个例子比如27,7的二进制是0111,2的二进制是0010 那么27变成定义串就是 0010 0111。题解:明显是数位dp,ac自动机上的数位dp。一开始把数字全弄成二进制来做,也是脑残了。直接数位dp,dfs就好了,状态很简单dp[pos][i]位数pos,在自动机上i点。注意高进度的减法,原创 2015-02-26 14:26:08 · 567 阅读 · 0 评论 -
hdu 3065 病毒侵袭持续中 (ac自动机)
题意:给出一个病毒库,然后给出一个网站,求这个病毒库中的病毒在这个网站上出现的次数。题解:直接ac自动机,然后用set保存出现在这个网站上的病毒编号。#include#include#include#include#include#include#include#includeusing namespace std;#define B(x) (1<<(x))ty原创 2015-02-23 15:05:34 · 415 阅读 · 0 评论 -
hdu 2296 Ring (ac自动机+dp)
题意:给出m个串,现在要得到长度题解:ac自动机上dp,dp[i][j] 长度为i结尾点为j的最大价值。path[i][j][1110]记录字符串。转移方程要好好理解,很神奇。具体看代码。#include#include#include#include#include#include#include#includeusing namespace std;#defi原创 2015-02-24 23:25:47 · 458 阅读 · 0 评论 -
hdu 3341 Lost's revenge (ac自动机+状压dp)
题意:给出目标串,给出n个模式串,现在问如何排列目标串使得目标串能含最多的模式串(可以重叠)。题解:好题!这题用状压,很明显只能用状压,一开想的也是状压但是没想到这样去状压。我们枚举串出现AGCT的个数,然后得到状态转移。代码犯了几个脑残的错误,word[now]++,word[now]+=word[fail[now]];上次犯用手写队列被卡内存了,甚是无语,看来以后还是用容器原创 2015-02-25 19:22:53 · 701 阅读 · 0 评论 -
hdu 2825 Wireless Password (ac自动机+状压dp)
题意:给出m个串,现在一个n个字母的字句里面必须包含至少p个m集合中的串。问有多少种方式。题解:kuangbin说ac自动机状态转移图什么,不是很懂。但是抛开这个,去思考也是可以做的。我们在ac自动机上dp肯定要设置这样的状态dp[i][j]走了i步,结尾是j节点,但是这样明显无法获得由几m集合中的串,分析发现这类似排列组合,要实现这样的计数问题,只能是状压dp,那么我们多设置一维dp原创 2015-02-24 11:20:19 · 549 阅读 · 0 评论 -
kuangbinOJ 1216 Gambler (ac自动机+概率dp)
题意:两个人分别拥有两个串P,Q,现在两个人玩掷硬币游戏,从一个空串开始,如果正面向上那么就在串后面+'1'否者+'0'。一旦这串中包含了P或者Q串就停止比赛,如果包含P则A赢,包含Q则B赢,否则平局。现在问A和B赢的概率分别是多少。题解:这题要分别对A赢和B赢进行dp,应为有平局的情况。那对于A赢dp,将P插入自动机标记为1,插入自动机标记-1,这样在建机时就将包含P和不包含Q的分开原创 2015-03-26 17:33:52 · 939 阅读 · 0 评论