【题目链接】: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. GO语言学习(十八)Go 语言接口

    Go 语言接口 Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口. 实例 /* 定义接口 */ type interface ...

  2. Java Web学习总结(5)——HttpServletResponse对象详解

    一.HttpServletResponse常见应用--生成验证码 1.1.生成随机图片用作验证码 生成图片主要用到了一个BufferedImage类, 生成随机图片范例: package gacl.r ...

  3. 深度学习利器: TensorFlow系统架构及高性能程序设计

    2015年11月9日谷歌开源了人工智能平台TensorFlow,同时成为2015年最受关注的开源项目之一.经历了从v0.1到v0.12的12个版本迭代后,谷歌于2017年2月15日发布了TensorF ...

  4. CSS笔记 - fgm练习 2-8 - 简易日历

    <style> *{margin: 0; padding: 0} .outer{ width: 240px; margin: 10px auto; background: #f0f0f0; ...

  5. Android小经验

    转载自:http://mp.weixin.qq.com/s?__biz=MzA4MjU5NTY0NA==&mid=404388098&idx=1&sn=8bbbba7692dc ...

  6. C语言深度剖析-----C语言中的字符串

    S1字符数组 S2字符串,存在于栈空间 S3最常规的写字符串的方法,malloc是堆空间,存在于只读存储区,我们不能够改变指向S3的数据 S4堆空间  S4 字符串的长度 判断字符串长度,assert ...

  7. ios根据字体大小设置

    , , , , , , , , , , , }; //这么多字体,从大到小挨个尝试 ; UIFont *font; ; i < array_length; i++) { font = [font ...

  8. 3、linux下Socket编程-TCP/UDP

    1.什么是Socket 网络的 Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返 回一个整型的Socke ...

  9. [TypeStyle] Style CSS pseudo elements with TypeStyle

    Just like pseudo-classes, pseudo-elements are added to selectors but instead of describing a special ...

  10. Spring web 工具类 WebApplicationContextUtils

    概述 Spring web 的工具类 WebApplicationContextUtils 位于包 org.springframework.web.context.support 是访问一个Servl ...