【BZOJ 1030】[JSOI2007]文本生成器
【题目链接】: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]文本生成器的更多相关文章
- 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]文本生成器 (ac自己主动机上的dp)
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2635 Solved: 1090 [id=1030&qu ...
- 【刷题】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 [题目大意] 求出包含任意一个给定串的串数量 [题解] 我们求出不包含任意一个给 ...
- BZOJ 1030 [JSOI2007]文本生成器 (Trie图+DP)
题目大意:给你一堆字符串,一个串不合法的条件是这些字符串中任意一个是这个串的子串,求合法的串的数量 其实这道题比 [HNOI2008]GT考试 那道题好写一些,但道理是一样的 只不过这道题的答案可以转 ...
- 1030: [JSOI2007]文本生成器
1030: [JSOI2007]文本生成器 https://www.lydsy.com/JudgeOnline/problem.php?id=1030 分析: AC自动机+dp. 正难则反,求满足的, ...
- 【BZOJ】1030: [JSOI2007]文本生成器(递推+ac自动机)
http://www.lydsy.com/JudgeOnline/problem.php?id=1030 其实做了1009也不会感到很难了,无非将kmp变成了ac自动机. 设f[i,j]表示前i个串当 ...
- 1030: [JSOI2007]文本生成器 - BZOJ
Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...
随机推荐
- MyCat:对MySQL数据库进行分库分表
本篇前提: mycat配置正确,且能正常启动. 1.schema.xml <table>标签: dataNode -- 分片节点指定(取值:dataNode中的name属性值) rule ...
- 机器学习算法中怎样选取超參数:学习速率、正则项系数、minibatch size
本文是<Neural networks and deep learning>概览 中第三章的一部分,讲机器学习算法中,怎样选取初始的超參数的值.(本文会不断补充) 学习速率(learnin ...
- 让你更值钱的方法:培养稀缺(追逐新技术,淬炼已有技能、做到出类拔萃,寻找自己所在的行业痛点,App开发者是市场动态平衡的典型)
一个开发者,如何才能更值钱? 答案非常简单:掌握稀缺资源. 那么,怎样才能持续不断地掌握稀缺资源,让自己更值钱呢? 请看接下来介绍的 2 种识别稀缺的方法和 2 种培养稀缺的策略. 稀缺资源的秘密 资 ...
- WebClient HttpWebRequest从网页中获取请求数据
WebClient HttpWebRequest //HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(urlAddress) ...
- Windows Forms 对话框篇
1,标准对话框 Windows内置的对话框,又叫公用对话框,它们作为组件提供的,并且存在于System.Windows.Forms命名空间中. 手工方式: private void button1_C ...
- Javascript和jquery事件-鼠标移入移出事件
javascript使用mouseover和mouseout,只在css中支持hover jquery支持mouseover和mouseout,封装了mouseenter.mouseleave事件函数 ...
- Gamma correction 伽马校准及 matlab 实现
matlab 内置实现:imadjust Gamma Correction gamma correction formula : .^(gamma) or .^(1/gamma)? 用以调整图像光照强 ...
- 【重拾Effective Java】一
之前看这本<Effective Java(第二版)>都是非常早曾经了.这本书确实是本好书.须要细嚼慢咽,每次看都有不同的体验. 在此写博客巩固一下. 第一章.创建和销毁对象 考虑用静态工厂 ...
- vc弹出USB的方法. 附试验通过的代码!
vc弹出USB的方法. 附试验通过的代码! http://blog.sina.com.cn/s/blog_4fcd1ea30100qrzn.html (2011-04-15 10:09:48) boo ...
- css3-10 如何控制元素的显示和隐藏(display和visibility的区别是什么)
css3-10 如何控制元素的显示和隐藏(display和visibility的区别是什么) 一.总结 一句话总结:使用的时候直接在元素的样式中设置display和visibility属性即可.推荐使 ...