【题目链接】:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1030

【题意】

【题解】

/*
先把AC自动机搞出来;
然后利用AC自动机,把所有的不可读文本处理出来;
实现方式:
设f[i][j]表示走完i步之后(文本有了i个字母)到达j节点的方案数;
对于节点j,如果它包含了某个单词.就忽略它;
利用AC自动机能够轻易地搞出f数组;
最后累加f[m][0..tot];
用总数减去它就好; 在搞自动机的失配函数的时候,可以把一个单词是另外一个单词的子串的情况弄出来;
就是说不一定都是
s[1..x]为可读单词;
这里x<=m
可能是s[i..j]为可读单词;
这里i>1,j<=m
这种情况可以在搞失配函数的时候顺便弄出来;
需要对KMP熟练一点才能体会吧
具体一点
如果
a[1..k]是一个单词

如果
s[j-k+1..j]=这个单词的话.
就在s[j]所在的节点打个标记;
标记它不能再继续组成不可读串
之后在进行DP的时候,遇到这个s[j]所代表的节点就会跳过.
之后就不会用那个节点更新不可读节点了.
*/

【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%lld",&x)
#define ref(x) scanf("%lf",&x) typedef pair<int, int> pii;
typedef pair<LL, LL> pll; const int dx[9] = { 0,1,-1,0,0,-1,-1,1,1 };
const int dy[9] = { 0,0,0,-1,1,-1,1,-1,1 };
const double pi = acos(-1.0);
const int N = 110;
const int MAXS = 110;
const int MOD = 1e4 + 7; int n, m, a[N * 65][27],tot = 1,f[N*65],cnt[N*65],dp[N][N*65];
char s[MAXS];
queue <int> dl; void in()
{
rei(n), rei(m);
rep1(i, 1, n)
{
scanf("%s", s);
int len = strlen(s), now = 1;
rep1(j, 0, len - 1)
{
int k = s[j] - 'A' + 1;
if (!a[now][k])
now = a[now][k] = ++tot;
else
now = a[now][k];
}
cnt[now] = 1;
}
} void aczidongji()
{
rep1(i, 1, 26)
a[0][i] = 1;
dl.push(1), f[1] = 0;
while (!dl.empty())
{
int x = dl.front();
dl.pop();
rep1(j, 1, 26)
{
if (!a[x][j])
continue;
int k = f[x];
while (!a[k][j]) k = f[k];
f[a[x][j]] = a[k][j];
dl.push(a[x][j]);
if (cnt[a[k][j]])
cnt[a[x][j]] = 1;
}
}
} void do_dp_ando()
{
dp[0][1] = 1;
rep1(i, 1, m)
{
rep1(j, 1, tot)
{
if (cnt[j] || dp[i - 1][j] == 0) continue;
rep1(k, 1, 26)
{
int y = j;
while (!a[y][k]) y = f[y];
dp[i][a[y][k]] = (dp[i][a[y][k]] + dp[i - 1][j]) % MOD;
}
}
}
int ans1 = 0,ans2=1;
rep1(i, 1, tot)
if (!cnt[i])
ans1 = (ans1 + dp[m][i]) % MOD;
rep1(i, 1, m)
ans2 = (ans2 * 26) % MOD;
printf("%d\n", (ans2 - ans1 + MOD) % MOD);
} int main()
{
//freopen("F:\\rush.txt", "r", stdin);
in();
aczidongji();
do_dp_ando();
//printf("\n%.2lf sec \n", (double)clock() / CLOCKS_PER_SEC);
return 0;
}

【BZOJ 1030】[JSOI2007]文本生成器的更多相关文章

  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]文本生成器 (ac自己主动机上的dp)

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2635  Solved: 1090 [id=1030&qu ...

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

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

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

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

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

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

  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. 【BZOJ】1030: [JSOI2007]文本生成器(递推+ac自动机)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1030 其实做了1009也不会感到很难了,无非将kmp变成了ac自动机. 设f[i,j]表示前i个串当 ...

  10. 1030: [JSOI2007]文本生成器 - BZOJ

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

随机推荐

  1. 【AtCoder Regular Contest 082 F】Sandglass

    [链接]点击打开链接 [题意] 你有一个沙漏. 沙漏里面总共有X单位的沙子. 沙漏分A,B上下两个部分. 沙漏从上半部分漏沙子到下半部分. 每个时间单位漏1单位的沙子. 一开始A部分在上面.然后在r1 ...

  2. Centos NFS 简单设置

    Server 端: NFS的安装配置:centos 5 :yum install nfs-utils portmapcentos 6 :yum install nfs-utils rpcbind vi ...

  3. 【AtCoder Beginner Contest 074 C】Sugar Water

    [链接]h在这里写链接 [题意] 让你在杯子里加糖或加水. (4种操作类型) 糖或水之间有一定关系. 糖和水的总量也有限制. 问你糖水浓度的最大时,糖和糖水的量. [题解] 写个dfs就好. 每次有4 ...

  4. docker基础(二)

    1.base镜像的特点 (1)不依赖于其他的镜像 (2)其它的可以通过它位基础作为容器的底层 2.在下载镜像的时候,只有几百M,但是安装一个Ubuntu虚拟机的镜像就比较大,首先会想到图形化界面,其实 ...

  5. swift项目第九天:正则表达式的学习

    import UIKit /* 练习1:匹配abc 练习2:包含一个a~z,后面必须是0~9 -->[a-z][0-9]或者[a-z]\d * [a-z] : a~z * [0-9]/\d : ...

  6. swift项目第三天:手写代码搭建主框架

    一:先配置环境:自定义Log输出(DEBUG 和 release模式),并屏蔽后台多余的打印信息 1:屏蔽后台多余的打印信息:如果写了OS_ACTIVITY_MODE = disable 还是不行.把 ...

  7. Pandoc —— 标记语言转换工具(中文乱码问题)

    今次毕业设计,来个逼格高的,用 latex 编写.谁曾想,学院首先要收一份 word 版的.辣么多的 latex 公式如何转呀. Pandoc 是由 John MacFarlane 开发的标记语言转换 ...

  8. 安装使用jupyter(原来的notebook)

    1.安装pyzmq 使用pip install pyzmq,安装不成功. 使用easy_install.exe pyzmq.成功安装. 2.安装tornado pip tornado 安装完尚不成功. ...

  9. ios开发网络学习五:输出流以及文件上传

    一:输出流 #import "ViewController.h" @interface ViewController ()<NSURLConnectionDataDelega ...

  10. Oracle 字符集的查看和修改 分类: H2_ORACLE 2013-06-19 16:52 316人阅读 评论(0) 收藏

    一.什么是Oracle字符集 Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系.ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据.它使数据库 ...