【BZOJ-1030】文本生成器 AC自动机 + DP
1030: [JSOI2007]文本生成器
Time Limit: 1 Sec Memory Limit: 162 MB
Submit:
3253 Solved: 1330
[Submit][Status][Discuss]
Description
JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版。该软件可以随机生成一些文章―――总是生成一篇长度固定且完全随机的文章——
也就是说,生成的文章中每个字节都是完全随机的。如果一篇文章中至少包含使用者们了解的一个单词,那么我们说这篇文章是可读的(我们称文章a包含单词b,当且仅当单词b是文章a的子串)。但是,即使按照这样的标准,使用者现在使用的GW文本生成器v6版所生成的文章也是几乎完全不可读的。
ZYX需要指出GW文本生成器 v6生成的所有文本中可读文本的数量,以便能够成功获得v7更新版。你能帮助他吗?
Input
输入文件的第一行包含两个正整数,分别是使用者了解的单词总数N (<=
60),GW文本生成器 v6生成的文本固定长度M;以下N行,每一行包含一个使用者了解的单词。
这里所有单词及文本的长度不会超过100,并且只可能包含英文大写字母A..Z 。
Output
一个整数,表示可能的文章总数。只需要知道结果模10007的值。
Sample Input
A
B
Sample Output
HINT
Source
Solution
字符串,首先想到AC自动机,方案数?想到DP
读入串,建Trie树,建出Fail指针
直接DP求满足的方案数似乎不太容易,不妨转换一下思路
应用补集的思想,求不满足的方案数,与总方案数做差即可,那么遍可以DP
$f[i][j]$表示的是匹配到第i个位置在AC自动机上的j点,转移不是很难想
那么利用快速幂计算一下总方案数,枚举一下$\sum f[m][i]$,做差及为答案
值得注意的地方:对于Fail指针指向的点,如果是end,那么当前点同样为end
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define p 10007
#define N 10010
int sz,son[N][],fail[N],q[N],loc[N],f[][N],n,m,ans;bool end[N];
void clear()
{
sz=;
for (int i=; i<=; i++) son[][i]=;
}
void insert(char s[])
{
int x=;
for (int i=; i<strlen(s); i++)
{
if (!son[x][s[i]-'A'+]) son[x][s[i]-'A'+]=++sz,x=sz;
else x=son[x][s[i]-'A'+];
}
end[x]=;
}
void buildfail()
{
int head=,tail=; q[]=; fail[]=;
while (head<tail)
{
int now=q[head++];
for (int i=; i<=; i++)
{
if (!son[now][i]) continue;
int ff=fail[now];
while(!son[ff][i]) ff=fail[ff];
fail[son[now][i]]=son[ff][i];
if (end[son[ff][i]]) end[son[now][i]]=;
q[tail++]=son[now][i];
}
}
}
int quick_pow(int x,int y)
{
long long re=;
for (int i=y; i; i>>=,x=x*x%p)
if (i&) re=re*x%p;
return (int)re;
}
int main()
{
clear(); char s[N];
scanf("%d%d",&n,&m);
for (int i=; i<=n; i++)
scanf("%s",s),insert(s);
buildfail();
f[][]=;
for (int i=; i<=m; i++)
for (int j=; j<=sz; j++)
if (!end[j] && f[i-][j])
for (int k=; k<=; k++)
{
int tmp=j;
while (!son[tmp][k]) tmp=fail[tmp];
f[i][son[tmp][k]]+=f[i-][j];
f[i][son[tmp][k]]%=p;
}
for (int i=; i<=sz; i++)
if (!end[i]) ans+=f[m][i],ans%=p;
int tot=quick_pow(,m);
printf("%d\n",(tot-ans+p)%p);
return ;
}
我觉得吧,我还得学习一个
【BZOJ-1030】文本生成器 AC自动机 + DP的更多相关文章
- [bzoj] 1030 文本生成器 || AC自动机+dp
原题 给出n个字符串,求随机生成一个m长度的字符串,有多少个是可辨识的(即出现了n个字符串中的任意字符串) 正难则反 求有多少个不可辨识的,26^m-不可辨识即为答案 f[i][j]表示填到第i个字符 ...
- bzoj1030 文本生成器(AC自动机+dp)
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4777 Solved: 1986[Submit][Stat ...
- [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个节点, ...
- 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 ...
- [BZOJ1030] [JSOI2007] 文本生成器 (AC自动机 & dp)
Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...
- [BZOJ1030]:[JSOI2007]文本生成器(AC自动机+DP)
题目传送门 题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群, 他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...
随机推荐
- POJ 3250 Bad Hair Day --单调栈(单调队列?)
维护一个单调栈,保持从大到小的顺序,每次加入一个元素都将其推到尽可能栈底,知道碰到一个比他大的,然后res+=tail,说明这个cow的头可以被前面tail个cow看到.如果中间出现一个超级高的,自然 ...
- UVALive 6181
模拟题,注意细节.. #include <iostream> #include<stdio.h> #include<math.h> #include<stri ...
- w3school-CSS
1.与XHTML不同,CSS对大小写不敏感.但是,当与HTML一起工作的时候,class和id名称对大小写是敏感的. 2.body {.....};通过css继承关系,子元素将继承最高级元素(本例是b ...
- iOS math.h数学函数
在实际工作中有些程序不可避免的需要使用数学函数进行计算,比如地图程序的地理坐标到地图坐标的变换.Objective-C做为ANSI C的扩展,使用C标准库头文件<math.h>中定义的数学 ...
- 006医疗项目-模块一:用户的查找:2.用户表查询的mapper映射的文件
前一篇文章已经把sql语句写好了并且在PL/SQL上调试过了,是可以的.这篇文章是写对应的mapper.xml, 第一步我们先通过逆向工程去构建每个表的mapper.xml文件和pojo类.这个我们在 ...
- 给 IIS Express 配置虚拟目录
使用 vs2015 打开旧项目,之前使用 iis 配置站点,然后在 vs 中附加 w3wp.exe 进行开发和调试的. 由于种种原因 iis 上配置站点各种失败. 之后发现,其实在 vs2015 中按 ...
- android volley get请求使用
调用百度api微博热门精选接口,使用了volley,简单说说volley get的请求方式的使用 header的设置和请求参数的设置,见代码如下: private void getWeixinNews ...
- U3D assetbundle加载与卸载的深入理解
using UnityEngine; using System.Collections; using System; public class testLoadFromAB : MonoBehavio ...
- Linux及安全——模块
Linux及安全——模块 一.模块的编译.生成.测试.删除 1.编写模块代码 编写:gedit test.c 查看:cat test.c 2.查看版本信息 3.编写Makefile obj-m :这个 ...
- 20135231 —— Linux 基础入门学习
20135231 何佳 学习计时:共12小时 读书:5 代码:2 作业:2 博客:3 一.学习目标 1. 能够独立安装Linux操作系统 2. 能够熟练使用Linux系统的基本命令 3. 熟练使用Li ...