AC自动机
文章平均质量分 67
最菜的acmer
这个作者很懒,什么都没留下…
展开
-
HDU3247-(AC自动机+spfa+状压dp)
题意:给你n个资源串和m个病毒串然后让你求最少需要多少个01字符才能做出不含病毒串并且含有所有的资源串的字符串题解:先跑一边AC自动机然后求出所有结点是资源串的结尾但是不是病毒串的结尾的结点,最后求这些结点到其他结点的最短距离,注意的是初始是空串所有0那个结点也要算进去,因为结点对应的数值很大但是满足条件的很少所以我们要给满足条件的结点重新编号,最后就是二维dp(第一维表示含有哪几个资源串,第原创 2017-10-01 15:44:47 · 476 阅读 · 0 评论 -
hdu2825-(AC自动机+状压DP)
题解:AC自动机,然后在自动机上跑一遍DP,第一维表示长度,第二维表示到达自动机上的哪一个结点,第三维用二进制表示有含有哪几个字符;然后转移方程就是dp[i+1][ret][k|v[ret]] = (dp[i+1][ret][k|v[ret]]+dp[i][j][k])%mod;有些dp[i][j][k]等于0就不用运算了#include#include#include#incl原创 2017-09-07 18:21:15 · 374 阅读 · 0 评论 -
POJ1625-(AC自动机+DP+大数)
题解:跑一遍AC自动机,后直接在上面dp一维表示字符长度二维表示处于那个结点最后标记一下那些位置是危险结点不要转移过去即可,由于这题数据很大又没有取膜所以要用大数相加#include#include#include#include#includeusing namespace std;const int mod = 1e8;struct node{ int len;原创 2017-09-07 18:32:00 · 292 阅读 · 0 评论 -
hdu2296-(AC自动机+DP)
题解:将字符串都放在AC自动机上然后看一下到达每个位置能增加多少权值,最后转移的时候跟根据权值大小,字典序大小更新一下即可.dp一维表示长度,二维表示到达哪个结点,一开始把所有的结点初始化成-表示不可能到达该结点dp[0][0]=0。转移方程看下面代码#include#include#include#include#includeusing namespace std;co原创 2017-09-07 18:28:55 · 506 阅读 · 0 评论 -
HDU6138 Fleet of the Eternal Throne
题意:让你找两个串最长公共子序列并且这两个最长公共子序列是某个串的前缀,让你求最长是多长 题解:用这些字符串建一个AC自动机,然后扔一个串进去看一下这个跑一边AC自动机因为AC自动机匹配的是某个串的前缀所以可以把这些结点加进去用set维护一下,最后另外一个串再跑一遍AC自动看他经过的那些节点的前缀是否再set里面如果有就ans = v[ret]; 用v数组记录一下该结点是第几个前缀即可#incl原创 2017-08-18 14:55:24 · 270 阅读 · 0 评论 -
HDU2243-AC自动机+矩阵
题意:中文题题解思路:首先要做这题得先去做POJ2778,然后你知道那么长度不超过m的方案数就是26+26^2+…+26^m减去矩阵(M+M^2+…M^m)第一行的总和,因为该题取摸2^64直接用unsigned long long 即可#include<iostream>#include<cstring>#include<cstdio>#include<queue>#include<alg原创 2017-07-13 11:25:28 · 213 阅读 · 0 评论 -
POJ2778-AC自动机+矩阵
题意:给你n个DNA序列然后求有多少个m长度的DNA序列不含有这个n个DNA序列的任意一个题解思路:那么这和矩阵有什么关系呢?我假设当前状态处于某个DNA序列的第a点那么我下一步可以走的就是下一个点不是任何DNA序列的尾结点然后把这个图看成一个有向图那么就是变成求长度为n的路径有几条最终的答案就是从结点0走到结点{0,1,2,3,。。。。。sz-1}此时的sz就是结点个数,然后用字典树加AC自动机构原创 2017-07-11 18:37:42 · 258 阅读 · 0 评论 -
ZOJ3430-AC自动机
题意:先给你n个编码后病毒(字符串),然后在输入m个编码后的文件(字符串)要你求未编码钱文件里面含有几种病毒题解思路:先反编码回去然后就是AC自动机模板顺便写个标记数组标记一下那些病毒已经被用过了#include<iostream>#include<cstring>#include<queue>#include<algorithm>#include<cstdio>using namespa原创 2017-07-11 18:29:25 · 316 阅读 · 0 评论 -
HDU2222-AC自动机
这题直接用AC自动机模板再加上这个结点已经被访问过了该结点就不需要再使用直接把这个结点对应的值重置为0 题目链接#include<cstdio>#include<queue>#include<algorithm>#include<cstring>#include<iostream>using namespace std;const int mx = 1e6+5;#define mes原创 2017-05-13 23:59:13 · 244 阅读 · 0 评论 -
HDU2896-AC自动机
*直接AC自动机模板然后搜索每一个子串中的失配位置里面有没有是某个之前输入字符串的结尾有就加入进去并且在字符串的结尾标记上是第几个字符如果不是结尾就标记为0 题目链接#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<queue>#include<set>#define mes(s原创 2017-05-20 00:04:58 · 201 阅读 · 0 评论 -
UVA - 10679(AC自动机)
题解:把模式串全部插入跑一遍自动机,接着把s扔进去跑一边顺带标记一下,最后判断我这个串有没有被标记即可#include#include#include#include#include#include#include#include#includeusing namespace std;#define rep(a,b) for(int i = a; i <= b; i++)原创 2017-12-25 00:15:48 · 282 阅读 · 0 评论