bzoj 1030 [JSOI2007]文本生成器(AC自动机+DP)
【题目链接】
http://www.lydsy.com/JudgeOnline/problem.php?id=1030
【题意】
给n个小串,随机构造一个长为m的大串,一个串合法当且仅当包含一个或多个给定的小串,问合法串的数目。
【思路】
AC自动机+DP
首先将问题转化为求不合法的大串的数目。
将所有单词加入AC自动机,让f[i][j]表示长度为i的文章结尾为自动机中的j号节点的不经过单词节点的方案总数(呼~),就是在自动机上找一条不经过单词节点的路径,DP统计。然后用总方案数26^m减去sigma{f[m][i] , 0<=i<sz且val[i]==0}
注意如果后缀是一个单词节点则该节点也要标记为单词节点。
【代码】
#include<cstdio>
#include<queue>
#include<cstring>
#include<iostream>
using namespace std; const int N=+,L=+;
const int node = N*L,MOD=1e4+;
const int sigma = ; struct ACauto{
int ch[node][sigma],f[node],val[node],sz;
void clear() {
sz=; memset(ch[],,sizeof(ch[]));
}
void insert(char *s) {
int n=strlen(s),u=;
for(int i=;i<n;i++) {
int c=s[i]-'A';
if(!ch[u][c]) {
memset(ch[sz],,sizeof(ch[sz]));
val[sz]=; ch[u][c]=sz++;
}
u=ch[u][c];
}
val[u]=;
}
void get_Fail() {
queue<int> q;
f[]=;
for(int c=;c<sigma;c++)
if(ch[][c]) f[ch[][c]]=,q.push(ch[][c]);
while(!q.empty()) {
int r=q.front(); q.pop();
for(int c=;c<sigma;c++) {
int u=ch[r][c]; if(!u) continue;
q.push(u); int v=f[r];
while(v&&!ch[v][c]) v=f[v];
if(val[ch[v][c]]) val[u]=;
f[u]=ch[v][c];
}
}
}
}ac; char s[L]; int n,m; int d[L][node]; int main() {
scanf("%d%d",&n,&m);
ac.clear();
for(int i=;i<n;i++) {
scanf("%s",s); ac.insert(s);
}
ac.get_Fail();
d[][]=;
for(int i=;i<=m;i++)
for(int j=;j<ac.sz;j++) if(!ac.val[j]&&d[i-][j]) {
for(int c=;c<sigma;c++) {
int k=j; while(!ac.ch[k][c]&&k) k=ac.f[k];
d[i][ac.ch[k][c]]=(d[i-][j]+d[i][ac.ch[k][c]])%MOD;
}
}
int ans1=,ans2=;
for(int i=;i<=m;i++) ans2=(ans2*)%MOD;
for(int i=;i<ac.sz;i++)
if(!ac.val[i]) ans1=(ans1+d[m][i])%MOD;
printf("%d",(ans2-ans1+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 最最最常见的多串匹配问题!题目求至少包含一个子串的方案数,则可以转化成全部方案-不 ...
随机推荐
- 更新 requests 包之后报 has no attribute '__getitem__' 的错
翻代码的时候看到段一年多前用 python 写的下载图片站图片的代码. 测试下看还能不能下到图片,结果发现跑不起来了,报了个如下的错误: TypeError: 'instancemethod' obj ...
- Mac OSX 安装Python的paramiko模块经验总结
一.简单介绍 最近需要用Python模拟登录远程服务器并自动执行一些代码,需要安装一个叫paramiko的模块. paramiko官方介绍遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接 ...
- WPF中Application.Current的使用
WPF程序对应一个Application对象,当前的Application对象可以通过Application.Current获取,通过获取到的Application对象,我们可以做以下的事情: App ...
- SQL中子查询为聚合函数时的优化
测试数据:create table test1 as select * from dba_objects where rownum<=10000;--10000条记录create table t ...
- C# Windows Service调用IBM Lotus Notes发送邮件
近日研究了下IBM Lotus Mail,这货果然是麻烦,由于公司策略,没有开放smtp,很多系统邮件都没有办法发送,于是入手google学习Lotus Mail,想做成Windows服务,提供wcf ...
- 【实用技巧】文件MD5修改方法
方法一 利用md5修改器 更新日志:2011-10-6 22:00修正对于路径中存在空格修改无效的bug2011-10-6 20:17更新:1.回归简约界面2.直接拖拽即可捕获地址3.一键修改文件 ...
- <二> SQL 基础
left (outer) join 结果集包含连接表的匹配行,也包括左连接表的所有行. select a.a, a.b, a.c, b.c b.d b.f from a left out join b ...
- 西门子plc串口通讯方式
西门子plc串口通讯的三种方式 时间:2015-10-25 14:31:55编辑:电工栏目:西门子plc 导读:西门子plc串口通讯的三种方式,分为RS485 串口通信.PPI 通信.MPI 通信,自 ...
- Ubuntu使用apt-get安装本地deb包
我们都喜欢使用apt-get,因为它实在是让我们大大的省心.但是,有时候我们会为网速慢,安装源不好而烦恼,所以我们可能会将一些常用软件包的deb文件保存在本地以备不时之需.当然了使用dpkg也可以直接 ...
- php 数组指针相关函数current(),next(),prev(),end()
mixed current(array target_array) current()函数返回位于target_array数组当前指针位置的数组值.与next().prev().和end()函数不同, ...