【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 \ ...
随机推荐
- mysql两种重要的引擎
其中MyISAM:不支持事物,表锁 .frm : 表结构定义文件 .MYD: 表数据 .MYI:索引文件 InnoDB:支持事物,行锁 .frm : 表结构定义文件 .ibd:表空间(数据和索引)
- C#联合WINCC之数据通信
[公众号dotNet工控上位机:thinger_swj] 在工控领域中,WINCC仍然占有很大的市场份额.很多时候我们说学习C#开发上位机可以取代传统的组态软件,两者就像冤家一样,然而,即使是冤家,也 ...
- # scrapy(二):get请求
scrapy中的get请求及基本使用: 1. 创建scrapy项目 scrapy startproject QiuBaiProject 2. 创建爬虫文件 scrapy genspider QiuBa ...
- Scala 基础(十五):Scala 模式匹配(三)
1 变量声明中的模式 match中每一个case都可以单独提取出来,意思是一样的. 应用案例 val (x, y) = (1, 2) val (q, r) = BigInt(10) /% 3 //说明 ...
- JVM 专题二十二:垃圾回收(六)垃圾回收器 (三)
4. GC日志分析 4.1 日志分析 通过阅读GC日志,我们可以了解Java虚拟机内存分配与回收策略. 内存分配与垃圾回收的参数列表-XX:+PrintGC:输出GC日志.类似-verbose: gc ...
- shell专题(五):运算符
1.基本语法 (1)“$((运算式))”或“$[运算式]” (2)expr + , - , \*, /, % 加,减,乘,除,取余 注意:expr运算符间要有空格 2.案例实操: (1)计 ...
- 数据库01 /Mysql初识、基本指令、数据库密码相关、创建用户及授权
数据库01 /Mysql初识.基本指令.数据库密码相关.创建用户及授权 目录 数据库01 /Mysql初识.基本指令.数据库密码相关.创建用户及授权 1. 数据库概述 2. 数据库管理系统/DBMS ...
- linux专题(九):磁盘管理
http://dwz.date/UDf 概述 Linux磁盘管理好坏直接关系到整个系统的性能问题. Linux磁盘管理常用命令为 df.du. df :列出文件系统的整体磁盘使用量 du:检查磁盘空间 ...
- Python数据可视化:画饼状图、折线图、圈图
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. from math import pi import matplotlib ...
- OSCP Learning Notes - Buffer Overflows(5)
Generating Shellcode & Gaining Root 1.Generate the shellcode on Kali Linux. LHOST is the IP of K ...