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]文本生成器的更多相关文章

  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]文本生成器(递推+ac自动机)

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

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

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

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

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

  7. AC自动机1030 [JSOI2007]文本生成器

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

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

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

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

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

随机推荐

  1. SVG基本图形

    SVG 是使用 XML 来描述二维图形和绘图程序的语言 SVG 指可伸缩矢量图形 (Scalable Vector Graphics) SVG 用来定义用于网络的基于矢量的图形 SVG 使用 XML ...

  2. html基值 仿淘宝

    $(function(){ var scale = 1 / devicePixelRatio; document.querySelector('meta[name="viewport&quo ...

  3. aop的概念以及 cglib-nodep-2.1_3.jar第三方jia包动态代理使用

    引入 cglib-nodep-2.1_3.ja包 cglib产生的代理类是目标类的子类 定义接口,让切面都继承它,方便加入到动态代理方法 的那个类中使用 在SalaryInterceptor类中使用  ...

  4. Spring Framework5.0 学习(4)—— 基本概念

    1.0  控制反转(IOC)/依赖注入(DI) 通过依赖注入(DI),对象的依赖关系将由负责协调系统关系中各个对象的第三方组件在创建对象是设定.对象无需自行创建或管理它们的依赖关系——依赖关系将被自动 ...

  5. Dispatch groups 与任务同步

    https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingG ...

  6. 「bzoj4264 小C找朋友」

    权限题 就是一个集合\(hash\) 集合\(hash\)可以用于判断两个集合是否相等,具体做法就是给每个随机一个值,之后异或起来就是可以了 这个题就是这样,处理出每个点直接相连的点集的\(hash\ ...

  7. 解决hash冲突方法

    转自:https://www.cnblogs.com/wuchaodzxx/p/7396599.html 目录 开放定址法 线性探测再散列 二次探测再散列 伪随机探测再散列 再哈希法 链地址法 建立公 ...

  8. PHP------知识复习

    PHP概述 (1)PHP(Hypertext  Perprocessor)超级文本预处理器 (2) PHP是一种在服务器端执行的嵌入HTML文档的脚本语言 (3) 是一种网站开发语言(B/S结构) ( ...

  9. MySQL 8.0.13的使用心得

    今天在阿里云上安装了最新版的MySQL,把碰到的一些问题总结下 1.导入从另一台服务器dump的.sql,出现如下提示: ERROR at line xxx: Unknown command '\\' ...

  10. 【题解】洛谷P1065 [NOIP2006TG] 作业调度方案(模拟+阅读理解)

    次元传送门:洛谷P1065 思路 简单讲一下用到的数组含义 work 第i个工件已经做了几道工序 num 第i个工序的安排顺序 finnish 第i个工件每道工序的结束时间 need 第i个工件第j道 ...