【BZOJ】1030: [JSOI2007]文本生成器(AC自动机+dp)
题目
传送门:QWQ
传送到洛谷QWQ
分析
我一开始也不会做这题的,后来看了很多网上的题解,终于AC了。(我好菜啊)
主要参考:传送门QWQ
直接搞非常麻烦,反正我是不会做。于是考虑求反,即求有多少不包含任何单词的数量。最后再用$ {26}^m $减去就ok了。
于是在$ AC $自动机上搞$ dp $。
用 $ dp[i][j] $表示前$ i $个字符在$ AC $自动机上位置为$ j $的方案数。
那么可以得出$ dp[i+1][k]=dp[i+1][k]+dp[i][j] $如果k是合法的儿子。
所以还要判断一下合法性(合法性 即:不是任何一个单词的end)
代码
#include <bits/stdc++.h>
using namespace std;
const int N=, MOD=; int son[N][], fail[N], end[N], newp, rt, q[N];
int dp[][], n, m;
char s[N]; int find(int cur,int i)
{
if(!cur) return rt;
if(son[cur][i]) return son[cur][i];
return fail[son[cur][i]]=find(fail[cur],i);
} int main()
{
for (int i=;i<;i++) son[][i]=;
newp=rt=;
scanf("%d%d",&n,&m); //Trie
for(int i=;i<=n;i++)
{
scanf("%s",s+);
int cur=rt, l=strlen(s+);
for(int j=;j<=l;j++)
{
if(!son[cur][s[j]-'A']) son[cur][s[j]-'A']=++newp;
cur=son[cur][s[j]-'A'];
}
end[cur]=;
} //fail
int l=,r=;q[]=;
for(;l<=r;l++)
{
for(int i=;i<;i++)
if(son[q[l]][i])
{
fail[son[q[l]][i]]=find(fail[q[l]],i);
q[++r]=son[q[l]][i];
}
} //dp
dp[][]=;
for(int i=;i<=m;i++)
for(int j=;j<=newp;j++)
{
for(int k=;k<;k++)
{
int cur=j, f=;
while(cur)
{
if(end[son[cur][k]]) { f=; break; }
cur=fail[cur];
}
if(f) continue; //不能放
cur=j;
while(!son[cur][k])
{
cur=fail[cur]; //从j向fail[j]跳直到有k儿子
}
cur=son[cur][k];
dp[i+][cur]=(dp[i+][cur]+dp[i][j])%MOD;
}
} int anss=, ans=;
for (int i=;i<=m;i++) anss=(anss*)%MOD; //转换
for (int i=;i<=newp;i++)
{
ans=(ans+dp[m+][i])%MOD; //最终答案是所有dp[m+1][x]的和
} printf("%d\n",(anss-ans+MOD)%MOD);
return ;
}
【BZOJ】1030: [JSOI2007]文本生成器(AC自动机+dp)的更多相关文章
- BZOJ 1030: [JSOI2007]文本生成器 [AC自动机 DP]
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3953 Solved: 1614[Submit][Stat ...
- 1030: [JSOI2007]文本生成器 ac自动机+dp
https://www.lydsy.com/JudgeOnline/problem.php?id=1030 求长度为m不包含n个子串的种数, 跑完ac自动机之后没办法跑矩阵快速幂,因为状态数比较大(6 ...
- bzoj 1030: [JSOI2007]文本生成器 (ac自己主动机上的dp)
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2635 Solved: 1090 [id=1030&qu ...
- [JSOI2007]文本生成器 --- AC自动机 + DP
[JSOI2007]文本生成器 题目描述: JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版. 该软件可以随机 ...
- 【bzoj1030】[JSOI2007]文本生成器 AC自动机+dp
题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固 ...
- 洛谷P4052 [JSOI2007]文本生成器 AC自动机+dp
正解:AC自动机+dp 解题报告: 传送门! 感觉AC自动机套dp的题还挺套路的,,, 一般就先跑遍AC自动机,然后就用dp dp的状态一般都是f[i][j]:有i个字符,是ac自动机上的第j个节点, ...
- [BZOJ1030] [JSOI2007] 文本生成器 (AC自动机 & dp)
Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...
- [BZOJ1030]:[JSOI2007]文本生成器(AC自动机+DP)
题目传送门 题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群, 他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...
- BZOJ1030[JSOI2007]文本生成器——AC自动机+DP
题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固 ...
- [Bzoj1030][JSOI2007]文本生成器(AC自动机&dp)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1030 最最最常见的多串匹配问题!题目求至少包含一个子串的方案数,则可以转化成全部方案-不 ...
随机推荐
- 《gradle 用户指南中文版》第3章 安装 gradle
macOS 下安装 gradle,只要可以安装sdk的系统,使用sdk来安装,那么安装方式基本是一样的. Gradle在所有主要操作系统上运行,只需要安装Java JDK或JRE版本7或更高版本.要检 ...
- 如何使用fiddller跟踪windows进程发送的请求20140911
总结点:如何使用fiddller跟踪windows进程发送的请求 案例如下: 需求:运维工具提出需求,对每个插件的配置文件,同步到运维中心时先加密,然后传输到运维中心解密,存储到数据库 测试分析:这个 ...
- Java中级面试题——(上)
List和Set比较,各自的子类比较 对比一:Arraylist与LinkedList的比较 1.ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高 ...
- nodejs返回接口给前端
1.修改app.js文件,将其中的user路由去掉. 2.在index路由中配置如下: router.all('*', function(req, res, next) { res.header( ...
- 【剑指offer】整数中1出现的次数,C++实现
原创博文,转载请注明出处!本题牛客网地址 博客文章索引地址 博客文章中代码的github地址 # 题目 # 思路 分析1在数字中出现的规律.设数字N = abcde ,其中abcde分别为十进制中各位 ...
- 今天需要做手机端访问的页面,所以把meta的整理一下。
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale= ...
- Windows中cmd操作mysql
打开CMD 将工作目录切换到MySQL的bin下 mysql -u root -p 输入密码即可登陆MySQL 问号可以查看帮助 首先需要选择操作的数据库use database_name 然后可以进 ...
- tensorflow图像基本处理
tensorflow库提供的专门的图片处理库,以下只是部分示例,更多函数请参照源码'\tensorflow_api\v1\image__init__.py' 加载图像 方式1: 使用tf.gfile. ...
- 《DSP using MATLAB》示例 Example 6.11
上代码: % x = -7:7 y = OnesComplement(x, 4) 函数OnesComplement代码: function [y] = OnesComplement(x, B); % ...
- javascript异常处理。 屏蔽异常
http://www.cnblogs.com/aqbyygyyga/archive/2011/10/29/2228824.html