1030: [JSOI2007]文本生成器

Time Limit: 1 Sec  Memory Limit: 162 MB

Submit: 2635  Solved: 1090

[

id=1030" style="color:blue; text-decoration:none">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

2 2

A

B

Sample Output

100

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)的更多相关文章

  1. BZOJ 1030: [JSOI2007]文本生成器 [AC自动机 DP]

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3953  Solved: 1614[Submit][Stat ...

  2. BZOJ 1030 [JSOI2007]文本生成器

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2624  Solved: 1087[Submit][Stat ...

  3. 【刷题】BZOJ 1030 [JSOI2007]文本生成器

    Description JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生 ...

  4. bzoj 1030 [JSOI2007]文本生成器(AC自动机+DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1030 [题意] 给n个小串,随机构造一个长为m的大串,一个串合法当且仅当包含一个或多个 ...

  5. BZOJ 1030 [JSOI2007]文本生成器(AC自动机)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1030 [题目大意] 求出包含任意一个给定串的串数量 [题解] 我们求出不包含任意一个给 ...

  6. 1030: [JSOI2007]文本生成器 ac自动机+dp

    https://www.lydsy.com/JudgeOnline/problem.php?id=1030 求长度为m不包含n个子串的种数, 跑完ac自动机之后没办法跑矩阵快速幂,因为状态数比较大(6 ...

  7. BZOJ 1030 [JSOI2007]文本生成器 (Trie图+DP)

    题目大意:给你一堆字符串,一个串不合法的条件是这些字符串中任意一个是这个串的子串,求合法的串的数量 其实这道题比 [HNOI2008]GT考试 那道题好写一些,但道理是一样的 只不过这道题的答案可以转 ...

  8. 1030: [JSOI2007]文本生成器

    1030: [JSOI2007]文本生成器 https://www.lydsy.com/JudgeOnline/problem.php?id=1030 分析: AC自动机+dp. 正难则反,求满足的, ...

  9. 【BZOJ1030】[JSOI2007]文本生成器 AC自动机+动态规划

    [BZOJ1030][JSOI2007]文本生成器 Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文 ...

随机推荐

  1. Knockout v3.4.0 中文版教程-1-入门和安装

    英文原版教程:http://knockoutjs.com/documentation/introduction.html 注:此教程根据英文原版翻译,仅作练习,如有不足或错误,请指正 说明: 对原文中 ...

  2. cf886d Restoration of string

    明确几点 假设有串 ab,那么 a 后头必须是 b,b 前头必须是 a,否则就不是最频繁的了. 不可成环,aba是非法的. #include <iostream> #include < ...

  3. nginx反向代理+负载均衡+https

    A服务器(192.168.133.1)作为nginx代理服务器 B服务器(192.168.133.2)作为后端真实服务器 访问https://www.test.com请求从A服务器上反向代理到B服务器 ...

  4. Ubuntu Flask安装与配置(待整理)

    工作中开发需要用到python的flask框架,无奈网络上的资源很少,连基本的安装和配置都不全,在这做一下整理,方便以后用到. ———————————————————————————— 由于比较繁琐, ...

  5. POJ——2251Dungeon Master(三维BFS)

    Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 25379   Accepted: 9856 D ...

  6. [UOJ#219][BZOJ4650][Noi2016]优秀的拆分

    [UOJ#219][BZOJ4650][Noi2016]优秀的拆分 试题描述 如果一个字符串可以被拆分为 AABBAABB 的形式,其中 A 和 B 是任意非空字符串,则我们称该字符串的这种拆分是优秀 ...

  7. HDU 5073 Galaxy ——乱搞

    [题目分析] 练习赛的T1. 只要看懂样例就可以猜结论了. 然后大胆猜测剩下的星星是一段,其余的都移到重心上去. 所以只要把计算的式子变形一下就很好维护了. 居然没有1A [代码] #include ...

  8. 洛谷P1435 回文字串

    题目背景 IOI2000第一题 题目描述 回文词是一种对称的字符串.任意给定一个字符串,通过插入若干字符,都可以变成回文词.此题的任务是,求出将给定字符串变成回文词所需要插入的最少字符数. 比如 “A ...

  9. 【2018.11.8】小迟的比赛 / Yuno like cake / 格子填数

    题目 $noip$ 欢乐赛真是欢乐,除了不欢乐的方面以外我都很欢乐. T1 鸡汤题目,故意输对后面的胜率又没有影响,为什么要故意输呢? 所以第二个决策是凑字用的,这题就是朴素递推概率,最后乘结果权值计 ...

  10. NOIP[2015] 运输计划(codevs 4632)

    题目描述 Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球.小 P ...