题目链接: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. 用Node.js原生代码实现静态服务器

    ---恢复内容开始--- 后端中服务器类型有两种 1. web服务器[ 静态服务器 ] - 举例: wamp里面www目录 - 目的是为了展示页面内容 - 前端: nginx 2. 应用级服务器[ a ...

  2. Sql Server 2008安装时提示重启计算机失败解决办法

    在键盘上按下组合键[Win]+[R],调出运行窗口.   在窗口中输入“regedit”,点击确定,打开注册表管理界面.   在注册表左侧目录栏中找到如下位置:“HKEY_LOCAL_MACHINE\ ...

  3. lLinux的常用命令

    命令基本格式: 命令提示符:[root@localhost ~]#      root 代表当前的登录用户(linux当中管理员账号是root)      @ 无实际意义      localhost ...

  4. windows下使用命令行获取管理员权限

    在win下运行npm install安装依赖出现错误: Error: EBUSY, resource busy or locked 搜索错误信息后发现是由于没有管理员权限,在bash中输入以下命令后运 ...

  5. [转]Tomcat9.0安装教程 Tomcat9.0环境变量配置教程

    [转]Tomcat9.0安装教程 Tomcat9.0环境变量配置教程 [转]超详细MySQL安装及基本使用教程

  6. VNware上安装虚拟机Ubuntu16.10 并安装petalinux

    1.下载 VMware VMware-workstation-full-15.0.0-10134415.exe 自己寻找激活码 Ubuntu镜像 UG1144 PetaLinux Tools Docu ...

  7. 进程间的mutex

    设两个进程共用一个临界资源的互斥信号量mutex=1,当mutex=-1时表示(). 一个进程进入了临界区,另一个进程等待 没有一个进程进入临界区 两个进程都进入临界区 两个进程都在等待 互斥信号量不 ...

  8. 记录ViewPager配合Fragment使用中遇到的一个问题

    java.lang.IllegalStateException: FragmentManager is already executing transactions 如图所示: 当调用 notifyD ...

  9. NODE升级到V12.X.X

    Node.js 是一个基于Chrome JavaScript运行时的平台,可轻松构建快速,可扩展的网络应用程序.最新版本 node.js yum存储库 由其官方网站维护.使用本教程添加yum存储库,并 ...

  10. ng mvc + @Valid + @RequestBody 接收json同时校验javaBean的数据有效性

    @Valid @RequestBody CustomerDto customerBean @RequestMapping(value="/customerDataSync.do", ...