1030: [JSOI2007]文本生成器
1030: [JSOI2007]文本生成器
https://www.lydsy.com/JudgeOnline/problem.php?id=1030
分析:
AC自动机+dp。
正难则反,求满足的,可以求出不满足的,用总的减去。所以考虑如何就出所有的长度为m的串里,没有出现任何一个单词的个数。
建立AC自动机,然后会有一些点是一定不能走的,这些点要么是某些单词的结尾,或者是包含了某些单词(以它结尾的串的后缀是一个单词)。
然后f[i][j]表示当前有i位,在AC自动机的第j个位置的方案数,即文本串中的后缀是AC自动机从0到这里构成的串,那么只要让文本串不要走有标记的点就行了。枚举下一位是什么,在AC自动机上转移。(注意,可能有许多点有些字符没有边,那么经过了这个字符也是合法的。这些的点贡献也要算上。假设存在这个点,直接转移即可。重新走到0号点的意义是当前和文本串的匹配长度为0)
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<cctype>
#include<set>
#include<vector>
#include<queue>
#include<map>
#define fi(s) freopen(s,"r",stdin);
#define fo(s) freopen(s,"w",stdout);
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ;
const int C = ;
const int mod = ; char s[N];
int f[N][C], ch[C][], val[C], fail[C], q[C], Index, n, m; void Insert(char *s) {
int u = , len = strlen(s + );
for (int i=; i<=len; ++i) {
int c = s[i] - 'A';
if (!ch[u][c]) ch[u][c] = ++Index;
u = ch[u][c];
}
val[u] = ;
}
void build() {
int L = , R = ; fail[] = ;
for (int c=; c<; ++c) {
int u = ch[][c];
if (u) fail[u] = , q[++R] = u;
}
while (L <= R) {
int u = q[L ++];
for (int c=; c<; ++c) {
int v = ch[u][c];
if (!v) {
ch[u][c] = ch[fail[u]][c]; continue; // !!!
}
q[++R] = v;
int p = fail[u];
while (p && !ch[p][c]) p = fail[p];
fail[v] = ch[p][c];
val[v] = val[v] ? val[v] : val[fail[v]];
}
}
}
void dp() {
f[][] = ;
for (int i=; i<m; ++i) {
for (int j=; j<=Index; ++j) {
if (val[j] || !f[i][j]) continue;
for (int c=; c<; ++c) { // 不仅要走存在的,也要走不存在的点,存在的点不能走有标记的。
(f[i + ][ch[j][c]] += f[i][j]) %= mod;
}
}
}
}
int main() {
n = read(), m = read();
for (int i=; i<=n; ++i) {
scanf("%s", s + );
Insert(s);
}
build();
dp();
int ans = ;
for (int i=; i<=m; ++i) ans = (ans * ) % mod;
for (int j=; j<=Index; ++j)
if (!val[j]) ans = (ans - f[m][j] + mod) % mod;
cout << ans;
return ;
}
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]文本生成器(递推+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版.该软件可以随机生成一些文章―――总是 ...
- 【刷题】BZOJ 1030 [JSOI2007]文本生成器
Description JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生 ...
- AC自动机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 [题目大意] 求出包含任意一个给定串的串数量 [题解] 我们求出不包含任意一个给 ...
随机推荐
- websphere部署中文乱码问题
WebSphere上面的java虚拟机存在默认编码方式,默认为ISO-8859-1. 在JAVA虚拟机的定制属性页面上,添加如下内容: 1.修改服务器编码类型: (1)前台修改方法: 服务器-> ...
- The transaction log for database 'XXX' is full due to 'ACTIVE_TRANSACTION'.
Msg 9002, Level 17, State 4, Line 4The transaction log for database 'Test' is full due to 'ACTIVE_TR ...
- mac git 命令自动补全
步骤如下: 1.下载Git-completion.bash 或者直接使用SourceTree去clone到本地. 下载地址:https://github.com/markgandolfo/git-ba ...
- ASP.NET Web API编程——使用自签名SSL证书
1自签名SSL证书的创建 创建自签名SSL工具xca为:https://sourceforge.net/projects/xca/ 创建过程 1)创建根证书 打开软件,界面如下. 点击,看到下拉菜单, ...
- es6之类与对象
一.类的定义 class Parent{ constructor(name="mukewang"){ this.name=name; } } let v_parant=new Pa ...
- 实例:接口并发限流RateLimiter
需求:接口每秒最多只能相应1个请求 1.创建 全局类对象 import com.google.common.util.concurrent.RateLimiter; import org.spring ...
- Unity应用发布如何在本地查看Debug输出?
http://blog.csdn.net/zfsr05255134/article/details/51867323
- DBUtils连接池,websocket
1.mysql数据库连接池 概念:数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放. 这样 ...
- ArrayList详解
一.ArrayList类介绍:(这里给出jdk1.8源码上中文翻译) ArrayList是List接口以可变数组方式实现的,实现了所有的lis接口中的操作,并容许有null等所有元素.除了实现了Lis ...
- 在IDEA中关于项目java版本问题
在IDEA中关于项目java版本问题 当出现错误如:java无效的源发行版11或IDEA Error:java:Compliation failed:internal java complier er ...