[JSOI2007]文本生成器(AC自动机,DP)
题目链接:
题目大意:给定 $n$ 个只含大写字母的串(称为可读串),问有多少种只含大写字母的长为 $m$ 的串,包含至少一个可读串。
$1\le n\le 60,1\le \text{每个串长}\le 100,1\le m\le 100$。
stmN年没发过博客了赶紧发一发
第一道在AC自动机上DP的题,纪念纪念。
首先可以发现答案就是所有串的个数减去不包含可读串的串的个数。
前半部分是 $26^m$。后半部分使用DP求解。
首先建出可读串的AC自动机。
令 $dp[i][j]$ 表示串长为 $i$,在AC自动机上走到编号为 $j$ 的节点的合法串个数。
如果走到 $j$ 的儿子 $k$ 这个节点的串合法,那么就可以从 $(i,j)$ 转移到 $(i+1,ch[j][k])$。
$dp[i+1][ch[j][k]]+=dp[i][j](0\le k<26)$
初始状态 $dp[0][0]=1$。答案为所有 $dp[m][i]$ 的最大值。
可能看到这里,你最大的疑问就是:如何判断走到点 $j$ 的串是否合法?真的可行吗?
想一想在AC自动机的fail的性质。我们就可以发现:如果从点 $j$ 不停沿fail往上跳,经过的所有点(包括 $j$)没有串尾的节点,那么 $j$ 合法,否则不合法。
这个合法性可以在BFS求fail时顺带求出。
(仔细想一想在AC自动机上跑匹配的本质就明白了)
时间复杂度 $O(m\sum|S|)$,空间复杂度 $O(\sum|S|)$,全都带一个 $26$ 的常数。
代码:
#include<bits/stdc++.h>
using namespace std;
const int mod=;
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline int read(){
char ch=getchar();int x=,f=;
while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return f?-x:x;
}
int n,m,cnt,q[],h,r,ch[][],dp[][],fail[];
bool war[]; //war表示节点是否不合法(不合法!不合法!)
char str[];
void insert(char str[],int len){
int now=;
FOR(i,,len){
int p=str[i]-'A';
if(!ch[now][p]) ch[now][p]=++cnt;
now=ch[now][p];
}
war[now]=true; //串尾不合法
}
void build(){
h=;r=;
FOR(i,,) if(ch[][i]) q[++r]=ch[][i];
while(h<=r){
int u=q[h++];
FOR(i,,) if(ch[u][i]){
fail[ch[u][i]]=ch[fail[u]][i];
war[ch[u][i]]|=war[fail[ch[u][i]]];
//如果fail不合法,自己也不合法
q[++r]=ch[u][i];
}
else ch[u][i]=ch[fail[u]][i];
}
}
int qpow(int a,int b){
int ans=;
for(;b;b>>=,a=a*a%mod) if(b&) ans=ans*a%mod;
return ans;
}
int main(){
n=read();m=read();
FOR(i,,n) scanf("%s",str+),insert(str,strlen(str+));
build();
dp[][]=;
FOR(i,,m-) FOR(j,,cnt) FOR(k,,)
if(!war[ch[j][k]]) dp[i+][ch[j][k]]=(dp[i+][ch[j][k]]+dp[i][j])%mod;
//ch[j][k]合法,可以转移
int ans=qpow(,m);
FOR(i,,cnt) ans=(ans-dp[m][i]+mod)%mod; //容斥一下
printf("%d\n",ans); //答案
} AC自动机上DP
AC自动机上DP
[JSOI2007]文本生成器(AC自动机,DP)的更多相关文章
- [JSOI2007]文本生成器 --- AC自动机 + DP
[JSOI2007]文本生成器 题目描述: JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版. 该软件可以随机 ...
- BZOJ 1030: [JSOI2007]文本生成器 [AC自动机 DP]
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3953 Solved: 1614[Submit][Stat ...
- 【bzoj1030】[JSOI2007]文本生成器 AC自动机+dp
题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固 ...
- 洛谷P4052 [JSOI2007]文本生成器 AC自动机+dp
正解:AC自动机+dp 解题报告: 传送门! 感觉AC自动机套dp的题还挺套路的,,, 一般就先跑遍AC自动机,然后就用dp dp的状态一般都是f[i][j]:有i个字符,是ac自动机上的第j个节点, ...
- [BZOJ1030] [JSOI2007] 文本生成器 (AC自动机 & dp)
Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...
- [BZOJ1030]:[JSOI2007]文本生成器(AC自动机+DP)
题目传送门 题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群, 他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...
- BZOJ1030[JSOI2007]文本生成器——AC自动机+DP
题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固 ...
- 1030: [JSOI2007]文本生成器 ac自动机+dp
https://www.lydsy.com/JudgeOnline/problem.php?id=1030 求长度为m不包含n个子串的种数, 跑完ac自动机之后没办法跑矩阵快速幂,因为状态数比较大(6 ...
- [Bzoj1030][JSOI2007]文本生成器(AC自动机&dp)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1030 最最最常见的多串匹配问题!题目求至少包含一个子串的方案数,则可以转化成全部方案-不 ...
- BZOJ_1030_[JSOI2007]文本生成器_AC自动机+DP
BZOJ_1030_[JSOI2007]文本生成器_AC自动机+DP Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群, 他 ...
随机推荐
- WPF save listbox config
UI <Grid x:Class="WzlyTool.ReplyContentUI" xmlns="http://schemas.microsoft.com/win ...
- 20155232《网络对抗》Exp4 恶意代码分析
20155232<网络对抗>Exp4 恶意代码分析 1.实践目标 1.1是监控你自己系统的运行状态,看有没有可疑的程序在运行. 1.2是分析一个恶意软件,就分析Exp2或Exp3中生成后门 ...
- # 20155319 Exp3 免杀原理与实践
20155319 Exp3 免杀原理与实践 基础问题 (1)杀软是如何检测出恶意代码的? 基于特征码的检测 启发式的恶意软件检测 基于行为的恶意软件检测 (2)免杀是做什么? 免杀,从字面进行理解,避 ...
- 【php增删改查实例】 第三节 - mysql 建表
这一节,来给数据库中添加一些测试数据. 登陆mysql: 找到%xampp%\mysql\bin 目录, 在此处打开命令窗口,用root用户登陆mysql 用户表建表sql: CREATE TABLE ...
- VS Code使用Git管理代码
Visual Studio Code(简称VS Code)是一个轻量级且强大的代码编辑器,后台是微软,支持Windows.Mac和Linux操作系统,拥有丰富的插件生态系统,可通过安装插件来支持C++ ...
- Sterling B2B Integrator与SAP交互 - 02 安装配置
系统组成: 1. 服务器OS及硬件: OS: Red Hat Enterprise Linux Server release 6.6 Hardware: Virtual Machine, x86_64 ...
- Gulp:插件编写入门
之前挖了个坑,准备写篇gulp插件编写入门的科普文,之后迟迟没有动笔,因为不知道该肿么讲清楚Stream这货,毕竟,gulp插件的实现不像grunt插件的实现那么直观. 好吧,于是决定单刀直入了.文中 ...
- cocos2d-x学习之路(二)——分析AppDelegate和HelloWorldScene文件
这里我们来看一下cocos自动给我们生成的工程里有些什么东西,并且分析一下这些代码的用途,来为我们以后编写cocos程序铺下基础. 这里我建议看我这份随笔的看官先看看cocos官网的快速入门手册,不然 ...
- Vue全家桶介绍
一直不清楚全家桶是什么玩意,上网搜了一下,才知道就是平时项目中使用的几个依赖包,下面分享一下 Vue 全家桶介绍 Vue有著名的全家桶系列,包含了vue-router(http://router.vu ...
- DevOps on AWS之Cloudformation概念介绍篇
Cloudformation的相关概念 AWS cloudformation是一项典型的(IAC)基础架构即代码服务..通过编写模板对亚马逊云服务的资源进行调用和编排.借助cloudformation ...