建AC自动机后, dp(x, y, s)表示当前长度为x, 在结点y, 包括的串的状态为s的方案数, 转移就在自动机上走就行了. 对于输出方案, 必定是由给出的串组成(因为<=42), 所以直接暴搜答案. 数据范围很小, 可以AC(复杂度懒得算了....) ------------------------------------------------------------------------------------------------ #include<cstdio> #in…
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1559 分析: 这个题意真的是很**啊!!!直接说每一个字符串至少出现一次不就好了吗......一开始理解错了ORZ 观察发现这个东西是字符串相关,并且有多个模板串,所有串的长度短并且串的数量不多,最多10个,因此大概可以想到一个AC自动机上面的状压. 首先把被包含的单词去掉,它们对决策不影响,这样在写方程的时候就可以不考虑last了. 令f(i,l,s)表示当位于AC自动机的状态i时,…
题目描述 输入 输出 样例输入 10 2 hello world 样例输出 2 helloworld worldhello 提示 这题算是一个套路题了,多个串求都包含它们的长为L的串的方案数. 显然是一个在AC自动机(trie图)上DP,常规DP状态是f[i][j]表示在AC自动机上走了i步到达了j节点的方案数. 但这道题还要求包含所有模式串,而且模式串最多10个,因此再加一维f[i][j][k]表示在AC自动机上走了i步到达了j节点,已经包含的字符串状态为k的方案数,其中k是一个二进制状态.…
题目链接:BZOJ - 1559 题目分析 将给定的串建成AC自动机,然后在AC自动机上状压DP. 转移边就是Father -> Son 或 Now -> Fail. f[i][j][k] ,表示到了字符串第 i 位,在AC自动机的第 j 个节点上,状态为 k 的方案数. 状态 k 是一个二进制压缩的,表示已经包含了哪些给定串的整数. 然后...输出方案....这个太麻烦了...我是从最后状态DFS向前反推. 另外的问题是我写的AC自动机DP无法正确处理给定串存在串 A 包含串 B 的情况,所…
题面 bzoj luogu 首先看到这题就知道随便暴枚 只要是多项式算法都能过 先常规建AC自动机 注意被别的单词包含的单词没有存在的价值 剩余单词状压 大力dp f[长度][节点编号][状态] \(ans = \sum f[m][i][S]\) 这里把题面的l换成m了 表示密码长度 如果方案数小于等于42的话 说明这个密码是给定词拼成的 不会有自由字母 那么就逆向找到转移到它的状态 记录密码就好啦 注意比较那里原来写的是 if(x.s[i] > y.s[i]) return 1; 显然这样是不…
http://www.lydsy.com/JudgeOnline/problem.php?id=1559 2009年的省选题虽然比起现在简单了不少,但对我来说还是很有挑战性的. 首先对于这种多串匹配问题,第一个想到的就应该是AC自动机. 还是老套路,f[i][j]表示走到字符串的第i位,现在在自动机上的第j位时的信息.增加一维n位的压位表示各个串是否都被匹配到了. 但是这里有个问题,如果S1包含了S2,那么我们只需要S1被匹配就能保证S2也被匹配,而不需要在自动机上走到S2的位置. 这样我们预处…
原题 给出n个字符串,求随机生成一个m长度的字符串,有多少个是可辨识的(即出现了n个字符串中的任意字符串) 正难则反 求有多少个不可辨识的,26^m-不可辨识即为答案 f[i][j]表示填到第i个字符,在自动机上第j个节点时的答案 状态转移方程很明显: f[i][j]+=f[i-1][f[j]] #include<cstdio> #include<cstring> #define p 10007 #define N 6010 using namespace std; int n,m…
题目链接:BZOJ - 3530 题目分析 明显是 AC自动机+DP,外加数位统计. WZY 神犇出的良心省选题,然而去年我太弱..比现在还要弱得多.. 其实现在做这道题,我自己也没想出完整解法.. 就想出了个 O(l^3) 的做法: 完全按照数位统计的思想来,先统计长度不足 len 的数字的合法种类数,这个枚举开头,然后 AC 自动机 DP 一下,用 f[i][j] 表示到了第 i 位,在第 j 个节点上的合法数字个数.这样是 O(L^2). 然后长度等于 n 的部分,就按照数位统计,一位位向…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1030 [题意] 给n个小串,随机构造一个长为m的大串,一个串合法当且仅当包含一个或多个给定的小串,问合法串的数目. [思路] AC自动机+DP    首先将问题转化为求不合法的大串的数目. 将所有单词加入AC自动机,让f[i][j]表示长度为i的文章结尾为自动机中的j号节点的不经过单词节点的方案总数(呼~),就是在自动机上找一条不经过单词节点的路径,DP统计.然后用总方案数26^m减…
[题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法]AC自动机+DP+矩阵快速幂 [题解]其实题意的数据范围不太清晰,反正开200个点就足够了. 因为要匹配禁忌串,所以对禁忌串集合建立AC自动机,标记禁忌串结尾节点,以及下传到所有能fail到的点(这些点访问到都相当于匹配了禁忌串). 令f[i][j]表示匹配到节点i,长度为j的串的数量,先预处理a[i][j…