BZOJ1030 [JSOI2007]文本生成器 AC自动机 动态规划
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - BZOJ1030
题意概括
给出n个模式串,问长度为m的串中有多少个至少含有这n个模式串中的任意一个。
注意,所有的串仅由A~Z 26个大写字母构成。
题解
AC自动机好题。
先构建一个AC自动机。
然后在AC自动机上面跑dp。
建议开滚动数组。
dp[i][j]表示长度为i,在AC自动机上面走到了j的方案数。
每次把所有走到模式串尾的全动统计到答案并清零。
代码
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <cstdio>
#include <cmath>
using namespace std;
const int N=+,L=+,Trie_Size=N*L;
const int mod=;
struct Trie{
int fail,e;
int next[];
void set(){
fail=e=;
memset(next,,sizeof next);
}
}tree[Trie_Size];
int cnt;
void AC_init(){
cnt=;
tree[].set(),tree[].set();
for (int i=;i<;i++)
tree[].next[i]=;
}
void add(char ch[]){
int len=strlen(ch),rt=,t;
for (int i=;i<len;i++){
t=ch[i]-'A';
if (!tree[rt].next[t]){
tree[++cnt].set();
tree[rt].next[t]=cnt;
}
rt=tree[rt].next[t];
}
tree[rt].e=;
}
void build_AC(){
int q[Trie_Size],head=,tail=,rt,son,k;
q[++tail]=,tree[].fail=;
while (head<tail){
rt=q[++head];
for (int i=;i<;i++){
son=tree[rt].next[i];
if (!son){
tree[rt].next[i]=tree[tree[rt].fail].next[i];
continue;
}
k=tree[rt].fail;
while (!tree[k].next[i])
k=tree[k].fail;
tree[son].fail=tree[k].next[i];
tree[son].e|=tree[tree[k].next[i]].e;
q[++tail]=son;
}
}
}
int n,m,dp[Trie_Size],pre[Trie_Size],Pow[L];
char str[L];
int main(){
scanf("%d%d",&n,&m);
AC_init();
for (int i=;i<=n;i++){
scanf("%s",&str);
add(str);
}
build_AC();
Pow[]=;
for (int i=;i<=m;i++)
Pow[i]=Pow[i-]*%mod;
memset(dp,,sizeof dp);
memset(pre,,sizeof pre);
dp[]=;
int ans=;
for (int i=;i<=m;i++){
for (int j=;j<=cnt;j++)
pre[j]=dp[j];
memset(dp,,sizeof dp);
for (int j=;j<=cnt;j++)
if (pre[j]>)
for (int k=;k<;k++)
dp[tree[j].next[k]]=(dp[tree[j].next[k]]+pre[j])%mod;
for (int j=;j<=cnt;j++)
if (tree[j].e){
ans=(ans+dp[j]*Pow[m-i])%mod;
dp[j]=;
}
}
printf("%d",ans);
return ;
}
BZOJ1030 [JSOI2007]文本生成器 AC自动机 动态规划的更多相关文章
- 【BZOJ1030】[JSOI2007]文本生成器 AC自动机+动态规划
[BZOJ1030][JSOI2007]文本生成器 Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文 ...
- [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版.该软件可以随机生成一些文章―――总是生成一篇长度固 ...
- BZOJ1030: [JSOI2007]文本生成器(AC自动机)
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5984 Solved: 2523[Submit][Status][Discuss] Descripti ...
- [bzoj1030][JSOI2007]文本生成器——AC自动机
Brief Description 给定一些模式串,您需要求出满足以下要求的字符串的个数. 长度为m 包含任意一个模式串 Algorithm Design 以下内容来自神犇博客 首先运用补集转换,转而 ...
- [Bzoj1030][JSOI2007]文本生成器(AC自动机&dp)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1030 最最最常见的多串匹配问题!题目求至少包含一个子串的方案数,则可以转化成全部方案-不 ...
- 【BZOJ-1030】文本生成器 AC自动机 + DP
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3253 Solved: 1330[Submit][Stat ...
- [JSOI2007]文本生成器 --- AC自动机 + DP
[JSOI2007]文本生成器 题目描述: JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版. 该软件可以随机 ...
随机推荐
- 出售爱奇艺 tx好莱坞 优酷 乐视 芒果 搜狐 等一个月会员激活码
出售爱奇艺 tx好莱坞 优酷 乐视 芒果 搜狐 等一个月会员激活码 进群价格有优惠 QQ群:569333649
- Bleve代码阅读(一)——新建索引
引言 Bleve是Golang实现的一个全文检索库,类似Lucene之于Java.在这里通过阅读其代码,来学习如何使用及定制检索功能.也是为了通过阅读代码,学习在具体环境下Golang的一些使用方式. ...
- 第17月第28天 python yield
1. class Fab(object): def __init__(self, max): self.max = max self.n, self.a, self.b = 0, 0, 1 def _ ...
- php 全局变量问题
当在函数里通过require_once包含另外php文件. 而另外php文件包含了另外php文件,而该php文件的函数需要另外的php文件. 例子: installment_maintenance_s ...
- tomcat杂记
组成 Server –> Service –> Connector & Container( Engine –> Host –> Context( Wrapper( S ...
- JavaScript学习 - 基础(八) - DOM 节点 添加/删除/修改/属性值操作
html代码: <!--添加/删除/修改 --> <div id="a1"> <button id="a2" onclick=&q ...
- 使用密钥认证机制远程登录Linux
密钥认证机制 创建存放key的文件 1)创建目录 /root/.ssh 并设置权限 [root@localhost ~]# mkdir /root/.ssh mkdir 命令用来创建目录,以后会详细介 ...
- 【转】Python数据类型之“序列概述与基本序列类型(Basic Sequences)”
[转]Python数据类型之“序列概述与基本序列类型(Basic Sequences)” 序列是指有序的队列,重点在"有序". 一.Python中序列的分类 Python中的序列主 ...
- win7下出现读不到移动硬盘的解决办法
很多电脑会出现移动硬盘读不到,或者 读到部分盘的情况,那么下面我就为大家来一一解决这些情况: 方法一: 最常见的是硬盘供电不足导致 ,要么换一个硬盘盒子,要么给硬盘一个外加电源即可方法二: ...
- (网络编程)基于tcp(粘包问题) udp协议的套接字通信
import socket 1.通信套接字(1人1句)服务端和1个客户端 2.通信循环(1人多句)服务端和1个客户端 3.通信循环(多人(串行)多句)多个客户端(服务端服务死:1个客户端---&g ...