[Bzoj1030][JSOI2007]文本生成器(AC自动机&dp)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1030
最最最常见的多串匹配问题!题目求至少包含一个子串的方案数,则可以转化成全部方案-不包含子串的方案数。
求不包含任何字串的方案数即以所有子串建AC自动机,然后跑dp,dp[i][j]表示长度为i,在AC自动机上标号为j的点的子串方案数。
$ans=\sum_{i=0}^{len-1} dp[n][i]$,len为AC自动机节点编号。
最后用总方案数-ans即为最后答案。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + ;
typedef long long ll;
const int mod = ;
struct node {
int AC[][];
int End[];
int fail[];
int dp[][];
int len, root;
int newcode() {
memset(AC[len], -, sizeof(AC[len]));
End[len] = ;
len++;
return len - ;
}
void init() {
len = ;
root = newcode();
}
void build(string s) {
int k = s.size();
int now = root;
for (int i = ; i < k; i++) {
if (AC[now][s[i] - 'A'] == -)
AC[now][s[i] - 'A'] = newcode();
now = AC[now][s[i] - 'A'];
}
End[now] = ;
}
void getFail() {
queue<int>q;
fail[root] = root;
for (int i = ; i < ; i++) {
if (AC[root][i] != -) {
fail[AC[root][i]] = root;
q.push(AC[root][i]);
}
else
AC[root][i] = root;
}
while (!q.empty()) {
int now = q.front();
q.pop();
End[now] |= End[fail[now]];
for (int i = ; i < ; i++) {
if (AC[now][i] != -) {
fail[AC[now][i]] = AC[fail[now]][i];
q.push(AC[now][i]);
}
else
AC[now][i] = AC[fail[now]][i];
}
}
}
int solve(int n) {
for (int i = ; i <= n; i++)
for (int j = ; j <= len; j++)
dp[][] = ;
dp[][] = ;
for (int i = ; i <= n; i++) {
for (int j = ; j < len; j++) {
for (int k = ; k < ; k++) {
if (End[AC[j][k]] == )
continue;
dp[i][AC[j][k]] += dp[i - ][j];
dp[i][AC[j][k]] %= mod;
}
}
}
int ans = ;
for (int i = ; i < len; i++)
ans = (ans + dp[n][i]) % mod;
return ans;
}
}AC;
int main() {
string s;
int n, m;
scanf("%d%d", &n, &m);
AC.init();
for (int i = ; i <= n; i++) {
cin >> s;
AC.build(s);
}
AC.getFail();
int ans = AC.solve(m);
int sum = ;
for (int i = ; i <= m; i++)
sum = sum * % mod;
printf("%d\n", (sum - ans + mod) % mod);
}
[Bzoj1030][JSOI2007]文本生成器(AC自动机&dp)的更多相关文章
- [BZOJ1030] [JSOI2007] 文本生成器 (AC自动机 & dp)
Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...
- [BZOJ1030]:[JSOI2007]文本生成器(AC自动机+DP)
题目传送门 题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群, 他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...
- BZOJ1030[JSOI2007]文本生成器——AC自动机+DP
题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固 ...
- 【bzoj1030】[JSOI2007]文本生成器 AC自动机+dp
题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固 ...
- 【BZOJ-1030】文本生成器 AC自动机 + DP
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3253 Solved: 1330[Submit][Stat ...
- [JSOI2007]文本生成器 --- AC自动机 + DP
[JSOI2007]文本生成器 题目描述: JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版. 该软件可以随机 ...
- BZOJ 1030: [JSOI2007]文本生成器 [AC自动机 DP]
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3953 Solved: 1614[Submit][Stat ...
- 洛谷P4052 [JSOI2007]文本生成器 AC自动机+dp
正解:AC自动机+dp 解题报告: 传送门! 感觉AC自动机套dp的题还挺套路的,,, 一般就先跑遍AC自动机,然后就用dp dp的状态一般都是f[i][j]:有i个字符,是ac自动机上的第j个节点, ...
- [bzoj1030][JSOI2007]文本生成器——AC自动机
Brief Description 给定一些模式串,您需要求出满足以下要求的字符串的个数. 长度为m 包含任意一个模式串 Algorithm Design 以下内容来自神犇博客 首先运用补集转换,转而 ...
随机推荐
- 前端开发JavaScript入门——JavaScript介绍&基本数据类型
JavaScript 诞生于1995年,它的出现主要是用于处理网页中的 前端验证. • 所谓的前端验证,就是指检查用户输入的内容是否符合一定的 规则. • 比如:用户名的长度,密码的长度,邮箱的格式等 ...
- HTML文档流和脱离文档流
文档流:也就是我们通常看到的由左到右.由上而下的元素排列形式,在网页中每个元素都是默认按照这个顺序进行排序和显示的. 脱离文档流:元素脱离文档流之后,将不再在文档流中占据空间,而是处于浮动状态(可以理 ...
- 【知识强化】第七章 输入/输出系统 7.1 I/O系统基本概念
那么下面,我们将要进入计算机组成原理的最后一章,也就是我们的第七章,输入输出系统的学习.那么这一部分内容呢,我们之前呢一直在提,但是并没有详细地讲解,那么进入到我们第七章输入输出系统这一部分,我们就要 ...
- openstack stein部署手册 10. 创建实例
# 建立网络(provider)与子网 openstack network create --share --external --provider-physical-network provider ...
- 06.Linux-RedHat系统本地yum源配置
RedHat系统 1.挂载镜像光盘[root@localhost ~]# mount /dev/sr0 /media/cdrom/ 2.创建本地yum源仓库[root@localhost ~]# cd ...
- [NOI2004]郁闷的出纳员(平衡树)
[NOI2004]郁闷的出纳员 题目链接 题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的 ...
- java 继承父类并实现接口、接口之间的多继承
- [php代码审计] Window api函数 FindFirstFile 在php中的问题
include文件夹中文件: 内容: <?php echo __FILE__; ?> index.php: 演示如下: “<<”替换多个任意字符: “>”替换单个字符:
- 理解性能的奥秘——应用程序中慢,SSMS中快(4)收集解决参数嗅探问题的信息
---从计划缓存中直接获取查询计划和参数: ), ) SELECT @dbname = 'hydee_连锁', @procname = 'dbo.p_select_ware'; WITH baseda ...
- UE4开发PSVR游戏流程
先与sony的开发者关系部建立联系,展示工作室/公司制作PSVR游戏的构想和计划以及制作实力,如果对方觉得你提供的信息具有说服力,则会提供开发者资格,和你签署NDA,给你租借开发机和测试机(免费). ...