bzoj 1030: [JSOI2007]文本生成器 (ac自己主动机上的dp)
1030: [JSOI2007]文本生成器
Time Limit: 1 Sec Memory Limit: 162 MB id=1030" style="color:blue; text-decoration:none">Submit
Submit: 2635 Solved: 1090
[
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
ac自己主动机上的dp
dp[0][i][j]表示到第i位,以第j个状态结束不符合条件的串的个数
dp[1][i][j]表示到第i位,以第j个状态结束符合条件的串的个数
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int N = 6005;
const int MOD = 10007; int que[N], fr, ta; struct ACM {
int cnt;
int nxt[N][26], sum[N], fail[N];
void init() {
for(int i = 1; i <= cnt; ++i) {
sum[i] = fail[i] = 0;
for(int j = 0; j < 26; ++j)
nxt[i][j] = 0;
}
cnt = 1;
for(int i = 0; i < 26; ++i) nxt[0][i] = 1;
}
void insert(string str) {
int now = 1;
int len = str.length();
for(int i = 0; i < len; ++i) {
if(nxt[now][str[i] - 'A'] == 0) nxt[now][str[i] - 'A'] = ++cnt;
now = nxt[now][str[i] - 'A'];
}
sum[now] = 1;
}
void build_fail() {
fr = ta = 0;
que[ta++] = 1;
fail[1] = 0;
while(fr != ta) {
int now = que[fr++];
for(int i = 0; i < 26; ++i) {
int x = nxt[now][i];
if(x == 0) continue;
int tmp = fail[now];
while(nxt[tmp][i] == 0) tmp = fail[tmp];
fail[x] = nxt[tmp][i];
que[ta++] = x;
}
}
}
void debug() {
for(int i = 1; i <= cnt; ++i) {
cout<<i<<": "<<"fail = "<<fail[i]<<" [ ";
for(int j = 0; j < 26; ++j) {
if(nxt[i][j]) cout<<char(j + 'A')<<','<<nxt[i][j]<<' ';
}
puts("]");
}
}
void gao(int, int);
} acm; int dp[2][105][N]; void ACM::gao(int n, int m) {
build_fail();
//debug();
memset(dp, 0, sizeof(dp));
dp[0][0][1] = 1;
for(int i = 1; i <= m; ++i) {
for(int j = 1; j <= cnt; ++j) {
int u = j;
for(int k = 0; k < 26; ++k) {
int v = u;
while(nxt[v][k] == 0) v = fail[v];
v = nxt[v][k];
if(sum[v]) {
dp[1][i][v] = (dp[1][i][v] + dp[1][i - 1][u] + dp[0][i - 1][u]) % MOD;
dp[0][i][v] += 0;
} else {
dp[1][i][v] = (dp[1][i][v] + dp[1][i - 1][u]) % MOD;
dp[0][i][v] = (dp[0][i][v] + dp[0][i - 1][u]) % MOD;
}
}
}
}
int ans = 0;
for(int i = 1; i <= cnt; ++i)
ans = (ans + dp[1][m][i]) % MOD;
cout<<ans<<endl;
} string str[65]; bool ok(int x, int n) {
int len = str[x].length();
for(int i = 0; i < n; ++i) {
if(i == x) continue;
int pos = str[x].find(str[i]);
if(pos >= 0 && pos < len) return false;
}
return true;
} int main() {
int n, m;
cin>>n>>m;
acm.init();
for(int i = 0; i < n; ++i) {
cin>>str[i];
}
sort(str, str + n);
n = unique(str, str + n) - str;
for(int i = 0; i < n; ++i) {
if(ok(i, n)) acm.insert(str[i]);
}
acm.gao(n, m);
return 0;
}
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 ...
- BZOJ 1030 [JSOI2007]文本生成器
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2624 Solved: 1087[Submit][Stat ...
- 【刷题】BZOJ 1030 [JSOI2007]文本生成器
Description JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生 ...
- bzoj 1030 [JSOI2007]文本生成器(AC自动机+DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1030 [题意] 给n个小串,随机构造一个长为m的大串,一个串合法当且仅当包含一个或多个 ...
- BZOJ 1030 [JSOI2007]文本生成器(AC自动机)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1030 [题目大意] 求出包含任意一个给定串的串数量 [题解] 我们求出不包含任意一个给 ...
- 1030: [JSOI2007]文本生成器 ac自动机+dp
https://www.lydsy.com/JudgeOnline/problem.php?id=1030 求长度为m不包含n个子串的种数, 跑完ac自动机之后没办法跑矩阵快速幂,因为状态数比较大(6 ...
- BZOJ 1030 [JSOI2007]文本生成器 (Trie图+DP)
题目大意:给你一堆字符串,一个串不合法的条件是这些字符串中任意一个是这个串的子串,求合法的串的数量 其实这道题比 [HNOI2008]GT考试 那道题好写一些,但道理是一样的 只不过这道题的答案可以转 ...
- 1030: [JSOI2007]文本生成器
1030: [JSOI2007]文本生成器 https://www.lydsy.com/JudgeOnline/problem.php?id=1030 分析: AC自动机+dp. 正难则反,求满足的, ...
- 【BZOJ1030】[JSOI2007]文本生成器 AC自动机+动态规划
[BZOJ1030][JSOI2007]文本生成器 Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文 ...
随机推荐
- javamail腾讯企业邮箱发送邮件
此代码用的jar文件:mail.jar(1.4.5版本); 如果jdk用的是1.8版本会出现SSL错误:这个问题是jdk导致的,jdk1.8里面有一个jce的包,安全性机制导致的访问https会报错, ...
- 修改JVM的参数、Jstat、Jstack、gclog
---恢复内容开始--- 1. jetty 修改JVM的参数 deploy/bin/env.sh 在上面的环境变量脚本中进行修改:如果分配给JVM的内存是4g 这个里面的JAVA_OPTS 的配置项就 ...
- mysql无法启动,报错 Can't start server: can't create PID file: No space left on device
然后看mysql日志文件 出现Can't start server: can't create PID file: No space left on device 这个错误. 提示磁盘空间不足 后用d ...
- PHP “引号兄弟”
PHP的string最大可以达到2GB,不过很少会用到这么大的字符串. 单引号: 定义一个字符串最简单的方式是使用单引号,而在单引号字符串中要想表达一个单引号,需要在她的前面加个反斜线(\)来进行转义 ...
- 九度oj 题目1073:杨辉三角形
题目描述: 输入n值,使用递归函数,求杨辉三角形中各个位置上的值. 输入: 一个大于等于2的整型数n 输出: 题目可能有多组不同的测试数据,对于每组输入数据, 按题目的要求输出相应输入n的杨辉三角形. ...
- 好未来谢华亮:AI 在教育行业中的应用
11 月 23 日,在以「AI 产业技术的渗透与融合」为主题的 NIUDAY 北京站中,好未来 SEG 智慧教育事业部技术总监谢华亮为大家带来了关于「AI 在教育行业中的应用」的分享. 本文是对分享内 ...
- 【Luogu】P2617Dynamic Ranking(树状数组套主席树)
题目链接 树状数组套主席树有点难懂qwq 不好理解 树状数组套主席树的直观理解应该是:树状数组的每一个节点是一棵主席树. 普通区间修改我们是创建1个线段树,树状数组套主席树的时候我们就创建log个线段 ...
- 【Luogu】P2827蚯蚓(堆转队列)
按照国际惯例先发题目链接 woc从4月就开始做这sb题.最开始30分升到65分不管了,直到最近几天升到85分,再到今天AC.激动的心情自然是那些一遍就A或者一小时以内就A的神犇难以想象的. 下面说说 ...
- poj1930 数论
Dead Fraction Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 1258 Accepted: 379 Desc ...
- C\C++ 中的 strcat() 函数 —— 字符串的插入、拼接
转载链接:http://blog.csdn.net/smf0504/article/details/52055971 函数原型 extern char *strcat(char *dest,char ...