题目链接: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)的更多相关文章

  1. [BZOJ1030] [JSOI2007] 文本生成器 (AC自动机 & dp)

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

  2. [BZOJ1030]:[JSOI2007]文本生成器(AC自动机+DP)

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

  3. BZOJ1030[JSOI2007]文本生成器——AC自动机+DP

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

  4. 【bzoj1030】[JSOI2007]文本生成器 AC自动机+dp

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

  5. 【BZOJ-1030】文本生成器 AC自动机 + DP

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3253  Solved: 1330[Submit][Stat ...

  6. [JSOI2007]文本生成器 --- AC自动机 + DP

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

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

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3953  Solved: 1614[Submit][Stat ...

  8. 洛谷P4052 [JSOI2007]文本生成器 AC自动机+dp

    正解:AC自动机+dp 解题报告: 传送门! 感觉AC自动机套dp的题还挺套路的,,, 一般就先跑遍AC自动机,然后就用dp dp的状态一般都是f[i][j]:有i个字符,是ac自动机上的第j个节点, ...

  9. [bzoj1030][JSOI2007]文本生成器——AC自动机

    Brief Description 给定一些模式串,您需要求出满足以下要求的字符串的个数. 长度为m 包含任意一个模式串 Algorithm Design 以下内容来自神犇博客 首先运用补集转换,转而 ...

随机推荐

  1. Python在windows下编译成exe文件

    1. pip install pyinstaller 2. 在Terminal下输入:“pyinstaller -F -w  *.py” 就可以生成exe.生成的文件放在同目录dist下. -F(注意 ...

  2. 如何在Linux下手动编译安装gcc

    如果可以通过apt来安装的话,尽量不要手工编译了,手工编译是最后的选择.用apt安装,只需要输入一条命令: sudo apt-get install gcc 手工编译的话,gcc和其他软件包存在如下的 ...

  3. 详解webpack4打包--新手入门(填坑)

    注意,这个dev和build好像在哪儿见过??对了, 刚刚才在package.json里配置的“scripts”这一项的值就有“dev”和“build”.对,一点都不错,就是这2个值,这2个值代表的是 ...

  4. bzoj1706 [usaco2007 Nov]relays 奶牛接力跑 矩阵快速幂

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1706 题解 换个方法定义矩阵乘法:先加再取 \(\min\). 对于一个 \(n\times ...

  5. Git的配置与基本操作

    Git是一个版本控制软件,它可以让我们能够拍摄处于可行状态的项目的快照,修改项目(如实现新功能)后,如果项目不能正常运行,可以恢复到前一个可行状态. 通过使用版本控制,我们可以无忧无虑的改进项目,不用 ...

  6. 【leetcode】403. Frog Jump

    题目如下: 解题思路:我的做法是建立一个字典dic,key为stone,value是一个set,里面存的是从前面的所有stone跳跃到当前stone的unit集合.例如stones=[0,1,2,3] ...

  7. vue的响应接口

    Vue 可以添加数据动态响应接口. 例如以下实例,我们通过使用 $watch 属性来实现数据的监听,$watch 必须添加在 Vue 实例之外才能实现正确的响应. 实例中通过点击按钮自动加 1.set ...

  8. 026:if标签使用详解

    if标签使用详解: if 标签: if 标签相当于 Python 中的 if 语句,有 elif 和 else 相对应,但是所有的标签都需要用标签符号  {%  %}  进行包裹. if 标签中可以使 ...

  9. Netty学习笔记(一)

    学习圣思园Netty笔记,个人理解 2.netty宏观理解-本节内容: 1.阶段性事件驱动,一个请求分为若干阶段处理,每个阶段根据情况合理分配线程去处理,各阶段间通信采用异步事件驱动方式. 2.net ...

  10. 20180805-Java ByteArrayOutputStream类

    下面的例子演示了ByteArrayInputStream 和 ByteArrayOutputStream的使用: import java.io.* public class ByteStreamTes ...