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. [UWP] WinUI 2.6 使用指南

    2021年6月24日,Windows 11 正式对外发布,对于UWP开发者来说,这一天同样值得纪念,因为WinUI 2.6也正式发布了! 相同的时间点意味着一件事,即WinUI 2.6和Windows ...

  2. Java-Java8特性(更新中)

    Java8新特性 之前零零散散写了很多java8的内容,今天做一个整理,也算是整理用到的内容,当然细化的话还有很多,只是说暂时用不到,为了面试的话已经够了 日期计算 Lambda表达式 函数式接口(比 ...

  3. 每日三道面试题,通往自由的道路5——JVM

    茫茫人海千千万万,感谢这一秒你看到这里.希望我的面试题系列能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! 每日三道面试题,成就更好自我 昨天既然我们聊到了JVM,那我们继续这一个话题 ...

  4. Java安全之Fastjson内网利用

    Java安全之Fastjson内网利用 0x00 前言 在打Fastjson的时候,基本上都是使用JNDI注入的方式去打,也就是 JdbcRowSetImpl 链分析的链去打,但是遇到一些不出网的情况 ...

  5. keycloak~自定义rest接口

    rest资源 对于我们集成keycloak来说,你可能会遇到它没有实现的功能,这时需要对kc进行扩展,资源的扩展是其中一个方面,它需要实现RealmResourceProvider和RealmReso ...

  6. LeSS 的诞生(一):大规模团队该何去何从

    <敏捷宣言>发布后,"敏捷"被越来越多的小型开发团队认可.与此同时,另一个问题也逐渐暴露了出来:以 Scrum 为首的敏捷方法论对那些大规模的开发团队并不友好. 基于此 ...

  7. [Kick Start] 2021 Round B

    题目:Kick Start 2021 Round-B . Increasing Substring 输出字符串中每个字符的最长 Increasing Substring 的长度,非常简单的动态规划问题 ...

  8. AcWing 1141. 局域网

    某个局域网内有n台计算机和m条 双向 网线,计算机的编号是1~n由于搭建局域网时工作人员的疏忽, 现在局域网内的连接形成了回路,我们知道如果局域网形成回路那么数据将不停的在回路内传输,造成网络卡的现象 ...

  9. Java实验项目三——采用面向对象的方式设计线性表

    Program: 采用面向对象的方法设计一个线性表,目的是为其他需要用线性表的应用提供线性表对象. 1.list包中,定义线性表类 1 /* 2 * Description:定义线性表类 3 * 4 ...

  10. 锁&事务

    一.概述: 锁:是计算机协调多个进程或线程并发访问某一资源的机制,数据库中最重要的资源.数据库既要保证并发性,又要保证数据的一致性,所以锁机制也更复杂.在计算机科学中,锁(lock)或互斥(mutex ...