【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版.该软件可以随机生成一些文章―――总是 ...
随机推荐
- sql基础知识集锦
Sql常用语法 下列语句部分是Mssql语句,不可以在access中使用. SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT ...
- <一> 爬虫的原理
一.爬虫是什么? #1.什么是互联网? 互联网是由网络设备(网线,路由器,交换机,防火墙等等)和一台台计算机连接而成,像一张网一样. #2.互联网建立的目的? 互联网的核心价值在于数据的共享/传递:数 ...
- autohotkey 自动登录输入用户名密码 getElementsByTagName/getElementsByClassName/getElementById
针对button未设置id的.可以通过getElementsByTagName获取button的对象数组,再明确其在对象数组中的位置,如第4个button,通过[3]获取.再调用此对象的click() ...
- 7.1 基础知识Android消息处理机制
1. Android消息处理机制: Handler, MessageQueue, Looper, Thread 线程概念 : 一个应用程序运行时它的主体被称为进程, 一个进程内部可以有多个线程, 线程 ...
- Netty原理和使用
性能主题 Netty原理和使用 Netty是一个高性能 事件驱动的异步的非堵塞的IO(NIO)框架,用于建立TCP等底层的连接,基于Netty可以建立高性能的Http服务器.支持HTTP. WebSo ...
- [Node] Run Local DevDependencies from the Command Line with npx
In the past, you've needed to either write a package.json script or use the node_modules/.bin direct ...
- 新手MFC学习之Socket练习
事实上MFC这东西吧,好像也不光是MFC,非常多东西,事实上我如今才感觉到,假设想高速做一个东西出来的话.是没有必要系统的学关于这个东西的所有知识的.比方我想做一个MFC相似QQ的软件,可是我又不想花 ...
- 恢复SLAVE上的某几张表的简要方法
同步报错是遇到最多的一个问题,如果你修复后发现还没有解决,通常的方法就是在Master上重新dump出一份,然后在slave上恢复.这个方法是针对整个库不是很大的情况下使用的,那如果是较大,全部dum ...
- css实现悬浮效果的阴影
要实现的效果图: 图片.png 实现的代码: -webkit-box-shadow:0px 3px 3px #c8c8c8 ; -moz-box-shadow:0px 3px 3px #c8c8c8 ...
- 3930: [CQOI2015]选数|递推|数论
题目让求从区间[L,H]中可反复的选出n个数使其gcd=k的方案数 转化一下也就是从区间[⌈Lk⌉,⌊Hk⌋]中可反复的选出n个数使其gcd=1的方案数 然后f[i]表示gcd=i的方案数.考虑去掉全 ...