【bzoj1030】 JSOI2007—文本生成器
http://www.lydsy.com/JudgeOnline/problem.php?id=1030 (题目链接)
题意
给出$n$个单词,问有多少个长度为$m$的文本中至少包含一个单词。
Solution
构造好AC自动机以后在上面dp,$f[i][j]$表示长度为$i$匹配到自动机上节点$j$时的没有被任意单词匹配的文本个数。转移枚举接在第$j+1$个位置的字符是哪一个,并且保证走过的节点没有一个是结束节点就可以了。
细节
0号节点为root。
代码
// bzoj1030
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define LL long long
#define inf (1ll<<30)
#define MOD 10007
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
using namespace std; const int maxl=200,maxn=60;
int n,m,sz=1,f[maxl][maxn*maxl];
char s[maxl];
struct node {
int son[26],next,end;
int& operator [] (int x) {return son[x];}
}tr[maxn*maxl]; namespace ACM {
void insert(char *r) {
int len=strlen(r+1),p=1;
for (int i=1;i<=len;i++) {
if (!tr[p][r[i]-'A']) tr[p][r[i]-'A']=++sz;
p=tr[p][r[i]-'A'];
}
tr[p].end=1;
}
void buildfail() {
queue<int> q;q.push(1);
tr[1].next=0;
while (!q.empty()) {
int x=q.front();q.pop();
for (int i=0;i<26;i++) if (tr[x][i]) {
int k=tr[x].next;
while (!tr[k][i]) k=tr[k].next;
tr[tr[x][i]].next=tr[k][i];
tr[tr[x][i]].end|=tr[tr[k][i]].end;
q.push(tr[x][i]);
}
}
}
}
using namespace ACM; int main() {
scanf("%d%d",&n,&m);
for (int i=0;i<26;i++) tr[0][i]=1;
for (int i=1;i<=n;i++) {
scanf("%s",s+1);
insert(s);
}
buildfail();
f[0][1]=1;
for (int i=0;i<m;i++)
for (int j=1;j<=sz;j++) if (f[i][j]) {
for (int k=0;k<26;k++) {
int p=j;
while (!tr[p][k]) p=tr[p].next;
p=tr[p][k];
if (!tr[p].end) (f[i+1][p]+=f[i][j])%=MOD;
}
}
int sum=1,ans=0;
for (int i=1;i<=m;i++) (sum*=26)%=MOD;
for (int i=1;i<=sz;i++) (ans+=f[m][i])%=MOD;
printf("%d\n",(sum-ans+MOD)%MOD);
return 0;
}
【bzoj1030】 JSOI2007—文本生成器的更多相关文章
- BZOJ1030 JSOI2007 文本生成器 【AC自动机】【DP】*
BZOJ1030 JSOI2007 文本生成器 Description JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群,他们现 ...
- bzoj1030 [JSOI2007]文本生成器
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2654 Solved: 1100[Submit][Stat ...
- [Bzoj1030][JSOI2007]文本生成器(AC自动机)(dp)
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5254 Solved: 2172[Submit][Stat ...
- [BZOJ1030] [JSOI2007] 文本生成器 (AC自动机 & dp)
Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...
- BZOJ1030[JSOI2007]文本生成器——AC自动机+DP
题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固 ...
- BZOJ1030: [JSOI2007]文本生成器(AC自动机)
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5984 Solved: 2523[Submit][Status][Discuss] Descripti ...
- BZOJ1030: [JSOI2007]文本生成器(Trie图+dp)
Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...
- [BZOJ1030]:[JSOI2007]文本生成器(AC自动机+DP)
题目传送门 题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群, 他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...
- BZOJ1030 [JSOI2007]文本生成器 AC自动机 动态规划
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1030 题意概括 给出n个模式串,问长度为m的串中有多少个至少含有这n个模式串中的任意一个. 注意, ...
- BZOJ1030 [JSOI2007]文本生成器[DP+AC自动机]
我学到现在才是初三学弟的水平..哭 这里相当于求长度为$m$的,字符集$\{A...Z\}$的且不包含任一模式串的文本串个数.这是一个典型的AC自动机匹配计数问题. 设$f_{i,j}$表示在AC自动 ...
随机推荐
- C# httpRequest Soap请求
一般添加web服务引用是.NET用代理类模式 创建SOAP请求代理类,代理类是.NET开发工具VS自动给你生成. 下面用一般HTTP的模式有时候可能更合适,原理是构造SOAP请求的XML后POST过去 ...
- redis系列--你真的入门了吗?redis4.0入门~
前言 redis作为nosql家族中非常热门的一员,也是被大型互联网公司所青睐,无论你是开发.测试或者运维,学习掌握它总会为你的职业生涯增色添彩. 当然,你或多或少已经了解redis,但是你是否了解其 ...
- WPF编程,C#中弹出式对话框 MessageBox 的几种用法。
原文:WPF编程,C#中弹出式对话框 MessageBox 的几种用法. 1.MessageBox.Show("Hello~~~~"); 最简单的,只显示提示信息. 2.Mes ...
- [python]记录Windows下安装matplot的经历
最近学习在看<机器学习实战>一书,第二章的时候要用到Natplotlib画图,于是便开始安装Matplotlib.本文所用到的所有安装包都可以在文末的链接中找到. 首先从Matplotli ...
- [BZOJ3693]圆桌会议[霍尔定理+线段树]
题意 题目链接 分析 又是一个二分图匹配的问题,考虑霍尔定理. 根据套路我们知道只需要检查 "区间的并是一段连续的区间" 这些子集. 首先将环倍长.考虑枚举答案的区间并的右端点 \ ...
- 3、Docker容器管理
一.容器创建 1.创建命令 docker container [root@localhost harbor]# docker container Usage: docker container CO ...
- JavaScript快速入门-ECMAScript本地对象(Array)
Array对象 Array对象和python里面的list对象一样,是用来存储多个对象值的对象,且方法和属性基本上类似. 一.属性 lenght 二.方法 1.concat() 用于连接两个或多个 ...
- JQ_One()函数特效
先看一个例子,当点击 p 元素时,增加该元素的文本大小,代码如下:<script type="text/javascript" src="http://keleyi ...
- 【OpenCV学习笔记之一】图像加载,修改及保存
加载图像(用cv::imread)imread功能是加载图像文件成为一个Mat对象 其中第一个参数表示图像文件名称第二个参数 表示加载的图像是什么类型 支持常见的三个参数值IMREAD_UNCHANG ...
- Unity 角色场景传送功能
传送触发器 using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine. ...