F. 文本生成器

内存限制:512 MiB 时间限制:1000 ms 标准输入输出

题目类型:传统 评测方式:文本比较

题目描述

原题来自:JSOI 2007

JSOI 交给队员 ZYX 一个任务,编制一个称之为「文本生成器」的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是 GW 文本生成器 v6 版。该软件可以随机生成一些文章――总是生成一篇长度固定且完全随机的文章——也就是说,生成的文章中每个字节都是完全随机的。如果一篇文章中至少包含使用者们了解的一个单词,那么我们说这篇文章是可读的(我们称文章包含单词 ,当且仅当单词 是文章的子串)。

但是,即使按照这样的标准,使用者现在使用的 GW 文本生成器 v6 版所生成的文章也是几乎完全不可读的。ZYX 需要指出 GW 文本生成器 v6 生成的所有文本中可读文本的数量,以便能够成功获得 v7 更新版。你能帮助他吗?

输入格式

输入的第一行包含两个正整数,分别是使用者了解的单词总数N,GW 文本生成器 v6 生成的文本固定长度M;以下N行,每一行包含一个使用者了解的单词。

输出格式

一个整数,表示可能的文章总数。只需要知道结果模1e4+7

的值。

样例

样例输出

2 2

A

B

样例输出

100

数据范围与提示

对于全部数据,N<=60,所有单词及文本的长度不会超过100 ,并且只可能包含英文大写字母。

析:求合法的方案数,如果直接求那么比较难搞,那么我们就用单步容斥,合法=总数-不合法,而总数很显然为 26^m , 现在问题就变成了求不合法的方案数,那么我们就要在每个单词末尾打一个标记,不合法的就是没有标记的单词,

Refun:学长说AC自动机的DP都非常套路

大部分f[i][j]表示当前在节点j,且串长为i时的情况,

有时再加一维表示这个状态里面包含了哪些东西

而且AC自动机的DP会经常让你用矩阵乘法优化 

那么行吧,我们就设 f[i][j] 表示当前长度为 i ,所在节点为 j 的不合法的方案数

那么 f[i][use[j].son[k]]+=f[i-1][j];

计算过程中注意取模

#include<bits/stdc++.h>
#define re register int
#define int long long
using namespace std;
const int mo=1e4+7;
int n,m,ans,sum,cnt=1;
char s[1100];
int f[210][70*26*20];
queue<int>q;
struct CUN
{
int fail,flag;
int son[30];
}use[70*26*20];
void insert(char ss[])
{
int l=strlen(ss);
int now=1;
for(re i=0;i<l;i++)
{
int p=ss[i]-'A';
if(!use[now].son[p])
use[now].son[p]=++cnt;
now=use[now].son[p];
}
use[now].flag=1;
}
void get_fail()
{
for(re i=0;i<26;i++)
use[0].son[i]=1;
use[1].fail=0;
q.push(1);
while(!q.empty())
{
int u=q.front();
int Fail=use[u].fail;
q.pop();
for(re i=0;i<26;i++)
{
int v=use[u].son[i];
if(!v)
{
use[u].son[i]=use[Fail].son[i];
continue;
}
use[v].fail=use[Fail].son[i];
if(use[use[v].fail].flag)
use[v].flag|=use[use[v].fail].flag;
q.push(v);
}
}
}
int ksm(int d,int z)
{
int out=1;
while(z)
{
if(z&1)
out=out*d%mo;
z>>=1;
d=d*d%mo;
}
return out;
}
signed main()
{
cin>>n>>m;
for(re i=1;i<=n;i++)
{
cin>>s;
insert(s);
}
get_fail();
f[0][1]=1;
for(re i=1;i<=m;i++)
{
for(re j=1;j<=cnt;j++)
{
for(re k=0;k<26;k++)
{
if(!use[use[j].son[k]].flag)
{
f[i][use[j].son[k]]=(f[i][use[j].son[k]]%mo+f[i-1][j]%mo)%mo;
}
}
}
}
ans=ksm(26,m);
for(re i=1;i<=cnt;i++)
ans=(ans-f[m][i]+mo)%mo;
printf("%lld\n",(ans%mo+mo)%mo);
}

文本生成器(AC自动机+dp)的更多相关文章

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

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

  2. 【bzoj1030】[JSOI2007]文本生成器 AC自动机+dp

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

  3. bzoj1030 文本生成器(AC自动机+dp)

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

  4. 洛谷P4052 [JSOI2007]文本生成器 AC自动机+dp

    正解:AC自动机+dp 解题报告: 传送门! 感觉AC自动机套dp的题还挺套路的,,, 一般就先跑遍AC自动机,然后就用dp dp的状态一般都是f[i][j]:有i个字符,是ac自动机上的第j个节点, ...

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

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

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

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

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

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

  8. BZOJ 1030: [JSOI2007]文本生成器 [AC自动机 DP]

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

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

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

  10. 1030: [JSOI2007]文本生成器 ac自动机+dp

    https://www.lydsy.com/JudgeOnline/problem.php?id=1030 求长度为m不包含n个子串的种数, 跑完ac自动机之后没办法跑矩阵快速幂,因为状态数比较大(6 ...

随机推荐

  1. C# 位图BitArray 小试牛刀

    前面聊了布隆过滤器,回归认识一下位图BitMap,阅读前文的同学应该发现了布隆过滤器本身就是基于位图,是位图的一种改进. 位图 先看一个问题, 假如有1千万个整数,整数范围在1到1亿之间,如何快速确定 ...

  2. react中 props,state,render函数的关系

    1.当组件的 state 或者 props 发生改变的时候,自己的render函数就会重新执行. 2. 当父组件的render函数执行时,其所有子组件的render函数都会重新执行.

  3. Java 读取Word表格中的文本和图片

    本文通过Java程序来展示如何读取Word表格,包括读取表格中的文本和图片.下面是具体实现的步骤和方法. 1. 程序环境准备 代码编译工具:IntelliJ IDEA Jdk版本:1.8.0 测试文档 ...

  4. Vue 前端权限控制的优化改进版

    1.前言   之前<Vue前端访问控制方案 >一文中提出,使用class="permissions"结合元素id来标识权限控制相关的dom元素,并通过公共方法check ...

  5. Tiling 简单递推+大数

    Tiling c[0]=1,c[1]=1,c[2]=3;   c[n]=c[n-1]+c[n-2]*2;   0<=n<=250.   大数加法 java  time  :313ms 1 ...

  6. 互联网时代CRM软件帮助企业销售升级

    随着信息技术的发展,互联网+的浪潮逐渐改变了我们的生活.对于企业来说,他们的管理模式和服务模式也需要作出改变,企业不再满足只进行内部业务的优化和管理,传统CRM开始不再符合企业的需求.由此可见,在网络 ...

  7. Netty Recycler的源码分析

    Recycler分析 调用来源:PooledByteBuf.java 涉及的知识: AtomicInteger WeakReference ThreadLocal 在DefaultHandle 中调用 ...

  8. Https:SSL双向认证机制(理论知识)

    1.基础知识 这部分内容主要解释一些概念和术语,最好是先理解这部分内容. 1.1.公钥密码体制(public-key cryptography) 公钥密码体制分为三个部分,公钥.私钥.加密解密算法,它 ...

  9. PO,VO,BO,POJO,DAO的区别

    基本概念 PO:persistant object (持久化对象),可以看成是与数据库中的表相映射的java对象.最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合.PO中应该不 ...

  10. SpringCloud的Ribbon自定义负载均衡算法

    1.Ribbon默认使用RoundRobinRule策略轮询选择server 策略名 策略声明 策略描述 实现说明 BestAvailableRule public class BestAvailab ...