题目链接: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. 【记录】Git pull(拉取),push(上传)命令整理(详细)

    前言:博主最近在学习git命令,因为git是一个非常好用的分布式版本管理工具,功能比svn强大,与SVN不同点是Git去中心化,每一个分支都是一个中心,并且支持本地仓库存储,像如今很多大公司都用git ...

  2. Sersync 上配置 Sersync 服务

    上面的工作做好之后呢,下面就开始正式配置我们的 Sersync 了! 我们在 Sersync 安装过程中所用到包均是从谷歌 Sersync 项目组取得的,地址: https://code.google ...

  3. Arrays基本使用

    public static void main(String[] args) { String[] a = { "a", "b", "c" ...

  4. [python 学习]正则表达式

    re 模块函数re 模块函数和正则表达式对象的方法match(pattern,string,flags=0) 尝试使用带有可选的标记的正则表达式的模式来匹配字符串.如果匹配成功,就返回匹配对象:如果失 ...

  5. [php代码审计] apache 后缀名解析“漏洞”

    不能说是漏洞,只是 apache 特性而已. 下面是apache  httpd.conf中截取的一段: <IfModule mime_module> # # TypesConfig poi ...

  6. Synchronized锁升级

    Synchronized锁升级 锁的4中状态:无锁状态.偏向锁状态.轻量级锁状态.重量级锁状态(级别从低到高) 为什么要引入偏向锁? 因为经过HotSpot的作者大量的研究发现,大多数时候是不存在锁竞 ...

  7. JavaWeb(七):EL表达式、自定义标签和JSTL

    一.EL表达式 语法 el.jsp <%@page import="java.util.Date"%> <%@page import="com.atgu ...

  8. 【leetcode】1043. Partition Array for Maximum Sum

    题目如下: Given an integer array A, you partition the array into (contiguous) subarrays of length at mos ...

  9. FPGA资源平民化的新晋- F9 技术解析

    FPGA (现场可编程门阵列)由于其硬件并行加速能力和可编程特性,在传统通信领域和IC设计领域大放异彩.一路走来,FPGA并非一个新兴的硬件器件,由于其开发门槛过高,硬件加速算法的发布和部署保护要求非 ...

  10. springboot整合hibernate案例

    1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 4.0.0 2.GITHUB地址 https://github.com/nbfujx/springBo ...