欢迎访问~原文出处——博客园-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自动机 动态规划的更多相关文章

  1. 【BZOJ1030】[JSOI2007]文本生成器 AC自动机+动态规划

    [BZOJ1030][JSOI2007]文本生成器 Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文 ...

  2. [BZOJ1030] [JSOI2007] 文本生成器 (AC自动机 & dp)

    Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...

  3. [BZOJ1030]:[JSOI2007]文本生成器(AC自动机+DP)

    题目传送门 题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群, 他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...

  4. BZOJ1030[JSOI2007]文本生成器——AC自动机+DP

    题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固 ...

  5. BZOJ1030: [JSOI2007]文本生成器(AC自动机)

    Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 5984  Solved: 2523[Submit][Status][Discuss] Descripti ...

  6. [bzoj1030][JSOI2007]文本生成器——AC自动机

    Brief Description 给定一些模式串,您需要求出满足以下要求的字符串的个数. 长度为m 包含任意一个模式串 Algorithm Design 以下内容来自神犇博客 首先运用补集转换,转而 ...

  7. [Bzoj1030][JSOI2007]文本生成器(AC自动机&dp)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1030 最最最常见的多串匹配问题!题目求至少包含一个子串的方案数,则可以转化成全部方案-不 ...

  8. 【BZOJ-1030】文本生成器 AC自动机 + DP

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3253  Solved: 1330[Submit][Stat ...

  9. [JSOI2007]文本生成器 --- AC自动机 + DP

    [JSOI2007]文本生成器 题目描述: JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版. 该软件可以随机 ...

随机推荐

  1. # 20155214 2016-2017-2 《Java程序设计》第8周学习总结

    20155214 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 对于串流输入/输出使用inputStream/OutputStream来衔接数据源与目的地, ...

  2. mysql 查询优化案例汇总

    一 简介:此文章为经历过的sql案例集合和相关思路 二 案例1: 现象: 测试环境出现select语句,join2张表多次join,explain结果如下 出现 using where,using j ...

  3. Javascript - 学习总目录

    Javascript - 操作符 Javascript - 数据类型 Javascrip - 语句 Javascript - 函数 Javascript - 预编译与函数词法作用域 Javascrip ...

  4. ResNet152网络复现(Caffe)

    一.准备数据集 1)  下载数据集 Imagnet网站上下载了三类图片,分别是big cat.dog.fish,其中训练集的图片数一共是4149,测试集的图片数是1003,训练集和测试集的图片数比例4 ...

  5. JDK7与8内存参数解析与修改

    JDK内存 jdk内存实际是jvm内存,jvm有一个运行时数据区,其实就是对这一部分的大小分配. 运行时数据区通常包括这几个部分:程序计数器(Program Counter Register).Jav ...

  6. np.mat()和np.transpose

    例子: import numpy as np dataSet = [] with open('/home/lai/下载/20081023025304.plt') as fr: for line in ...

  7. SpringBoot定制错误的Json数据

    (1)自定义异常处理&返回定制Json数据 @ControllerAdvice public class MyExceptionHandler { @ResponseBody @Excepti ...

  8. Libevent源码分析系列

    1.使用libevent库     源码那么多,该怎么分析从哪分析呢?一个好的方法就是先用起来,会用了,然后去看底层相应的源码,这样比较有条理,自上向下掌握.下面用libevent库写个程序,每隔1秒 ...

  9. Python3学习笔记13-函数的参数

    定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数, 以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了 ...

  10. Websphere MQ Cluster

    大纲: 1.什么是集群 2.建立一个基本的集群 3.DISPLAY命令 4.负载均衡 5.高级配置和管理 6.答疑 7.关于文章.红宝书等 一. 什么是集群       集群就是Websphere M ...