【JSOI2007】文本生成器 题解(AC自动机+动态规划)
题目大意:给定$n$个子串,要求构造一个长度为$m$的母串使得至少有一个子串是其子串。问方案数。
------------------------
我们可以对要求进行转化:求出不合法的方案数,总方案数减去不合法的方案数即为合法方案数。
首先建一个AC自动机,对于每个串的末尾结点及其$fail$边指向的结点都打上标记,表示遍历AC自动机的时候不经过这些点(因为如果一个串是另一个串的后缀,显然这两个串都是合法的)。
然后就可以大力DP了。设$f[i][j]$表示走了$i$步到达$j$结点的方案数。则有转移方程$f[i+1][son(j)]+=f[i][j]$。答案即为$m^{26}-\sum\limits_{i=1}^{cnt} f[m][i]$。
代码:
#include<bits/stdc++.h>
using namespace std;
const int mod=1e4+;
int n,m,f[][],cnt,sum,ans=;
string ss;
struct node
{
int ch[],end,fail;
}tree[];
inline void build(string s)
{
int l=s.length(),now=;
for (int i=;i<l;i++)
{
if (!tree[now].ch[s[i]-'A']) tree[now].ch[s[i]-'A']=++cnt;
now=tree[now].ch[s[i]-'A'];
}
tree[now].end=;
}
inline void getfail()
{
queue<int> q;
for (int i=;i<;i++)
{
if (tree[].ch[i]) tree[].fail=,q.push(tree[].ch[i]);
}
while(!q.empty())
{
int now=q.front();q.pop();
for (int i=;i<;i++)
{
if (!tree[now].ch[i])
{
tree[now].ch[i]=tree[tree[now].fail].ch[i];
continue;
}
tree[tree[now].ch[i]].fail=tree[tree[now].fail].ch[i];
q.push(tree[now].ch[i]);
tree[tree[now].ch[i]].end|=tree[tree[tree[now].fail].ch[i]].end;
}
}
}
int main()
{
cin>>n>>m;
for (int i=;i<=n;i++) cin>>ss,build(ss);
tree[].fail=;
getfail();
f[][]=;
for (int i=;i<=m;i++)
for (int j=;j<=cnt;j++)
for (int k=;k<;k++)
if (!tree[tree[j].ch[k]].end)
f[i][tree[j].ch[k]]+=f[i-][j],f[i][tree[j].ch[k]]%=mod;
for (int i=;i<=m;i++) ans=(ans*)%mod;
for (int i=;i<=cnt;i++) sum+=f[m][i];
printf("%d",((ans-sum)%mod+mod)%mod);
return ;
}
【JSOI2007】文本生成器 题解(AC自动机+动态规划)的更多相关文章
- 2021.11.11 P4052 [JSOI2007]文本生成器(AC自动机+DP)
2021.11.11 P4052 [JSOI2007]文本生成器(AC自动机+DP) https://www.luogu.com.cn/problem/P4052 题意: JSOI 交给队员 ZYX ...
- 【bzoj1030】: [JSOI2007]文本生成器 字符串-AC自动机-DP
[bzoj1030]: [JSOI2007]文本生成器 首先把匹配任意一个的个数的问题转化为总个数-没有一个匹配的个数 先构造AC自动机,然后枚举每一位的字母以及在自动机上的位置 f[i][j]为第i ...
- BZOJ1030 JSOI2007 文本生成器 【AC自动机】【DP】*
BZOJ1030 JSOI2007 文本生成器 Description JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群,他们现 ...
- [Bzoj1030][JSOI2007]文本生成器(AC自动机)(dp)
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5254 Solved: 2172[Submit][Stat ...
- BZOJ 1030 [JSOI2007]文本生成器(AC自动机)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1030 [题目大意] 求出包含任意一个给定串的串数量 [题解] 我们求出不包含任意一个给 ...
- [JSOI2007]文本生成器(AC自动机+DP)
题意 给你n个串.问有多少长度为m的串使得这n个串至少在其中出现过一次.输出答案膜10007意义下的结果. (n<=100,每个串的长度<=100) 题解 在AC自动机上跑DP. 用到一个 ...
- 【洛谷 P4052】 [JSOI2007]文本生成器(AC自动机,DP)
题目链接 AC自动机上dp第一题嗷. 如果直接求可读文本的数量,显然要容斥,不好搞. 于是考虑求不可读文本的数量,再用\(26^m\)减去其即可. 建出AC自动机,如果一个节点为单词结尾或其fail链 ...
- BZOJ1030 [JSOI2007]文本生成器[DP+AC自动机]
我学到现在才是初三学弟的水平..哭 这里相当于求长度为$m$的,字符集$\{A...Z\}$的且不包含任一模式串的文本串个数.这是一个典型的AC自动机匹配计数问题. 设$f_{i,j}$表示在AC自动 ...
- bzoj 1030 [JSOI2007]文本生成器(AC自动机+DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1030 [题意] 给n个小串,随机构造一个长为m的大串,一个串合法当且仅当包含一个或多个 ...
- [JSOI2007]文本生成器(AC自动机,DP)
题目链接: 洛谷 LOJ BZOJ 题目大意:给定 $n$ 个只含大写字母的串(称为可读串),问有多少种只含大写字母的长为 $m$ 的串,包含至少一个可读串. $1\le n\le 60,1\le \ ...
随机推荐
- Qt-文件系统
1 简介 参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=45 参考文档:<Qt教程.docx> 说明:本文主要介绍Qt的文件系统. ...
- 装机预备技能,Linux系统简介,安装Linux系统,Linux基本操作-云计算学习(2)
装机预备技能 问题 要求安装一台可用的KVM服务器: RHEL与CentOS系统有什么关联? Linux系统中第三块SCSI硬盘如何表示? 步骤 实现此案例需要按照如下步骤进行. 步骤一:RHEL系统 ...
- Python 字符串改变
在Python中,字符串是不可变类型,即无法直接修改字符串的某一位字符. 因此改变一个字符串的元素需要新建一个新的字符串. 常见的修改方法有以下4种. 方法1:将字符串转换成列表后修改值,然后用joi ...
- LDAP注入介绍
LDAP注入介绍 一. 前言 前些日子在看 OWASP TOP 10 时看到了对LDAP注入攻击的介绍,对此产生了兴趣,在网上经过一番搜索之后找到了构成本文主要来源的资料,整理出来分享给大家. 二. ...
- requests接口自动化7-Multi/form-data文件上传形式的post请求:files
Multi/form-data文件上传形式的post请求:用files传参 fiddler里请求响应内容; 代码: import requests from requests_toolbelt imp ...
- 使用位运算、值交换等方式反转java字符串-共四种方法
在本文中,我们将向您展示几种在Java中将String类型的字符串字母倒序的几种方法. StringBuilder(str).reverse() char[]循环与值交换 byte循环与值交换 apa ...
- 一分钟部署nacos
第一步:下载nacos包 https://github.com/alibaba/nacos/releases D:\testNacos\nacos-server-1.3.0\nacos\bin 最后 ...
- 一位Google高管审查了20,000+简历,他发现了这5个致命的错误
工作与生活的平衡 下班划水摸鱼时间,我比较喜欢浏览一下各类新闻网页,比如说ins,这不,我就在ins上看到了这样的一篇文章,内容很简单,就是简历,但是就是这样一份简历,却让这位Google高管震惊不已 ...
- InceptionV4
目录 1. inception v4 2. Inception-resnet-v1 & Inception-resnet-v2 2.1 Inception-resnet-v1的组成模块 2.2 ...
- 【JVM之内存与垃圾回收篇】虚拟机栈
虚拟机栈 虚拟机栈概述 由于跨平台性的设计,Java 的指令都是根据栈来设计的.不同平台 CPU 架构不同,所以不能设计为基于寄存器的. 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同 ...