2021.11.11 P4052 [JSOI2007]文本生成器(AC自动机+DP)

https://www.luogu.com.cn/problem/P4052

题意:

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

该软件可以随机生成一些文章——总是生成一篇长度固定且完全随机的文章。 也就是说,生成的文章中每个字符都是完全随机的。如果一篇文章中至少包含使用者们了解的一个单词,那么我们说这篇文章是可读的(我们称文章 s 包含单词 t,当且仅当单词 t 是文章 s 的子串)。但是,即使按照这样的标准,使用者现在使用的 GW 文本生成器 v6 版所生成的文章也是几乎完全不可读的。ZYX 需要指出 GW 文本生成器 v6 生成的所有文本中,可读文本的数量,以便能够成功获得 v7 更新版。你能帮助他吗?

答案对 10^4 + 7 取模。

分析:

长度为m的字符串一共有 \(26^m\) 种不同的排列,根据容斥原理,我们可以求出有多少字符串没有出现这n个字符串中任意一个,结果一减就行。

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

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

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

来自https://www.luogu.com.cn/blog/Refun/solution-p4052

如果长度为i判断到 \(t[j][k]\) 时不是终点,那么 \(f[i][t[i][k]]\) 可以由 \(f[i-1][j]\) 转移过来。

代码如下:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std; const int N=110;
const int M=65;
const int mod=1e4+7;
int n,m;
char s[101];
struct node{
int t[6001][26],fail[6001],endi[6001],f[101][6001],tot;
queue<int>q;
inline void insert(char *s){
int len=strlen(s),u=0;
for(int i=0;i<len;i++){
int v=s[i]-'A';
if(!t[u][v])t[u][v]=++tot;
u=t[u][v];
}
endi[u]=1;
}
inline void build(){
for(int i=0;i<26;i++)if(t[0][i])q.push(t[0][i]);
while(!q.empty()){
int u=q.front();q.pop();
for(int i=0;i<26;i++){
if(t[u][i]){
fail[t[u][i]]=t[fail[u]][i];
endi[t[u][i]]|=endi[t[fail[u]][i]];
q.push(t[u][i]);
}else t[u][i]=t[fail[u]][i];
}
}
}
inline void solve(){
f[0][0]=1;
for(int i=1;i<=m;i++)
for(int j=0;j<=tot;j++)
for(int k=0;k<26;k++)
if(!endi[t[j][k]])f[i][t[j][k]]=(f[i][t[j][k]]+f[i-1][j])%mod;
int ans=1;
for(int i=1;i<=m;i++)ans=(ans*26)%mod;
for(int i=0;i<=tot;i++)ans=(ans-f[m][i]+mod)%mod;
cout<<ans;
}
}trie; int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)scanf("%s",s),trie.insert(s);
trie.build();
trie.solve();
return 0;
}

2021.11.11 P4052 [JSOI2007]文本生成器(AC自动机+DP)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  10. BZOJ_1030_[JSOI2007]文本生成器_AC自动机+DP

    BZOJ_1030_[JSOI2007]文本生成器_AC自动机+DP Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群, 他 ...

随机推荐

  1. GeneralUpdate20220323里程碑版本发布

    大家好我是juster,GeneralUpdate的开源项目作者.这次将发布GeneralUpdate里程碑版本,该版本发生了巨大改变历时4个月的时间终于要和大家见面了.开源不易希望大家能多多支持.可 ...

  2. Linux下面有7个运行等级  run level

    Linux下面有7个运行等级  run level run level 0  系统停机状态,系统默认运行级别不能设为0,否则不能正常启动 run level 1  单用户工作状态,root权限,用于系 ...

  3. Molecule实现数栈至简前端开发新体验

    Keep It Simple, Stupid. 这是开发人耳熟能详的 KISS 原则,也像是一句有调侃意味的善意提醒,提醒每个前端人,简洁易懂的用户体验和删繁就简的搭建逻辑就是前端开发的至简大道. 这 ...

  4. java反射笔记(学习尚硅谷java基础教程)

    反射一.概述:Reflection Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性 ...

  5. Java 中的 HashSet,内部是如何工作的?

    HashSet 的内部采用 HashMap 来实现.由于 Map 需要 key 和 value,所以 所有 key 的都有一个默认 value.类似于 HashMap,HashSet 不允许重复的 k ...

  6. 用 wait-notify 写一段代码来解决生产者-消费者问题?

    只要记住在同步块中调用 wait() 和 notify()方法,如 果阻塞,通过循环来测试等待条件.

  7. Python - 文档格式转换(CSV与JSON)

  8. BMZCTF 2020祥云杯到点了

    2020祥云杯到点了 下载附件得到三个word文档,我们打开第一个文档然后将隐藏文字显示出来 得到提示 我们查看属性应该就是日期了我们先把他记录下来 然后打开第二个文档 输入刚刚的密码 在第二个wor ...

  9. Vuet.js规则详解,它是你不知道的强大功能?

    Vuet.js是什么? Vuet.js是给Vue.js提供状态管理的一个工具,与vuex不同,它是一种崇尚规则定制的状态管理模式.事先将状态更新的规则写好,然后将规则注入到组件中,然后状态按照预订的规 ...

  10. java中Array(数组)的用法

    8.Array(数组)    数组是作为对象来实现的.(really occupy the memopry,真实的占用内存 ) An array is a data structure that st ...