bzoj1030】的更多相关文章

[题意] 给定一些单词,我们定义一篇可读文章至少包含一个这样的单词,求长度为M的可读文章总数. [分析] 用前几题的方法可以求长度为M的不可读的文章总数Sum,所以我们可以用26^M-Sum来求出可读文章的总数.不过这题的N*Len太大,也就是AC自动机的节点太多,如果用矩阵乘法求解用爆空间,所以我直接DP了. 代码如下: #include<cstdio> #include<cstdlib> #include<cstring> ; ; ; int n,m,tot,len…
[BZOJ1030]文本生成器(AC自动机,动态规划) 题面 BZOJ 题解 超级简单良心送分题 很明显是所有状态-不合法状态 合法状态就是\(26^m\) 不合法状态做一个\(dp\)就好 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include<set…
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1030 题意概括 给出n个模式串,问长度为m的串中有多少个至少含有这n个模式串中的任意一个. 注意,所有的串仅由A~Z 26个大写字母构成. 题解 AC自动机好题. 先构建一个AC自动机. 然后在AC自动机上面跑dp. 建议开滚动数组. dp[i][j]表示长度为i,在AC自动机上面走到了j的方案数. 每次把所有走到模式串尾的全动统计到答案并清零. 代码 #include <cstring> #…
http://www.lydsy.com/JudgeOnline/problem.php?id=1030 (题目链接) 题意 给出$n$个单词,问有多少个长度为$m$的文本中至少包含一个单词. Solution 构造好AC自动机以后在上面dp,$f[i][j]$表示长度为$i$匹配到自动机上节点$j$时的没有被任意单词匹配的文本个数.转移枚举接在第$j+1$个位置的字符是哪一个,并且保证走过的节点没有一个是结束节点就可以了. 细节 0号节点为root. 代码 // bzoj1030 #inclu…
[BZOJ1030][JSOI2007]文本生成器 Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固定且完全随机的文章—— 也就是说,生成的文章中每个字节都是完全随机的.如果一篇文章中至少包含使用者们了解的一个单词,那么我们说这篇文章是可读的(我们称文章a包含单词b,当且仅当单词b是文章a的子串).但是,即使按照这样的标准,使用者现…
BZOJ1030 JSOI2007 文本生成器 Description JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固定且完全随机的文章-- 也就是说,生成的文章中每个字节都是完全随机的.如果一篇文章中至少包含使用者们了解的一个单词,那么我们说这篇文章是可读的(我们称文章a包含单词b,当且仅当单词b是文章a的子串).但是,即使按照这样的标准,使…
[bzoj1030]: [JSOI2007]文本生成器 首先把匹配任意一个的个数的问题转化为总个数-没有一个匹配的个数 先构造AC自动机,然后枚举每一位的字母以及在自动机上的位置 f[i][j]为第i位在j的位置且没有匹配过任何一个串的个数 然后26^m-sum(f[m][j])就是答案 还有就是当p->fail一直到root的路径上只要有一个点是一个串的终点那么点f[i][p]就要ban掉 因为这个WA了好多次 /* http://www.cnblogs.com/karl07/ */ #inc…
题意:给出n个字符串,求长为m至少包含n个里其中一个的串的字符串一共有多少个,字符集为A到Z,答案对10007取模 n<=60,len<=100 思路:将至少一个转化为所有个数减去没有出现的个数 dp[i][j]表示长度为i,当前在AC自动机上j号节点的方案数 #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<iostream> #…
#include <cstdio> #include <queue> #include <cstring> using namespace std; ; int cnt; ][]; ]; ],last[]; int n,m; ][]; ]; ][][]; int newnode(){ return(++cnt); } void ins(int a[],int len){ ; ;i<=len;i++){ ) t=trie[t][a[i]]=newnode();els…
给你若干给字符串,再给你一个m,问长度是m的字符串中包含给定字符串的数量mod 10007是多少 这个拿过来啥思路也没有,后来还是看了题解,才知道,原来,原来....那个带fail的Trie还可以搞别的 网上的大多数都是26^m-补集做的,麻烦啊,网上有一个非洲猴的blog写的挺好的 设f[i][j][k]表示什么呢,表示i:0..1 j:0..m k:0...size 表示i状态,匹配到j,在Trie上是k的数量 f[i | val[next[c]]][j + 1][next[c]] += f…