[题解]P4052 [JSOI2007] 文本生成器
正难则反,我们发现用总字符串个数\(26^m\),减去不可读的字符串个数,可以得到结果。
下文中的“答案”均表示“不可读的字符串个数”。
要使一个字符串不可读,就不能让任何模式串在其中出现。如果某个主串的第\(i\)位与自动机的节点\(j\)相匹配,那么如果状态\(j\)包含模式串(即有一个前缀是一个模式串),那么不管主串第\(i+1\)位后是什么,一定是可读的,故此时“主串第\(i\)个字符,对应节点\(j\)”的答案是\(0\)。
再考虑\(j\)不包含任何模式串的情况,显然我们就可以把“主串第\(i-1\)个字符,对应节点\(fa[j]\)”的答案,转移到“主串第\(i\)个字符,对应节点\(j\)”上去。
其中\(fa[j]\)表示在Trie图上能通过一条有向边到达\(j\)的节点,可能有多个。
因此我们用\(f[i][j]\)表示主串第\(i\)个字符,对应节点\(j\)的答案,可以得到转移:
f[0][0]=1;
for(int i=1;i<=m;i++)//枚举长度
for(int j=0;j<=cnt;j++)//枚举所有Trie节点
for(int c=0;c<26;c++)
if(!fl[tr[j][c]])//如果tr[j][c]不包含模式串
f[i][tr[j][c]]+=f[i-1][j];//j转移到tr[j][c]
最终输出\(26^m-\sum\limits_{i=0}^{cnt} f[m][i]\)即可,注意\(i\)从\(0\)开始。
最后就是如何计算\(fl\)数组,即判断某个节点是否包含模式串。这个显然能在get_fail()中一并处理出来。如果\(u\)是模式串结尾,或者\(fl[fail[u]]=1\),那么\(fl[u]=1\)。
时间复杂度是\(O(m\times \sum|s|\times |\Sigma|)\),其中建自动机是\(O(\sum|s|\times |\Sigma|)\)。
别忘了取模~
点击查看代码
#include<bits/stdc++.h>
#define mod 10007
#define N 6010//节点数(模式串总长)
#define M 110//单个模式串长度
#define C 26//字符集大小
using namespace std;
int n,m,tr[N][C],fail[N],cnt;
int q[N],head,tail,f[M][N];
bool no[N];
string s;
void ins(string s){
int p=0;
for(char i:s){
int c=i-'A';
if(!tr[p][c]) tr[p][c]=++cnt;
p=tr[p][c];
}
no[p]=1;
}
void get_fail(){
head=0,tail=-1;
for(int i=0;i<26;i++) if(tr[0][i]) q[++tail]=tr[0][i];
while(head<=tail){
int u=q[head++];
for(int i=0;i<26;i++){
if(tr[u][i]) fail[tr[u][i]]=tr[fail[u]][i],q[++tail]=tr[u][i],
no[tr[u][i]]|=no[fail[tr[u][i]]];
else tr[u][i]=tr[fail[u]][i];
}
}
}
int qpow(int a,int b){
int fac=1;
while(b){
if(b&1) fac=fac*a%mod;
a=a*a%mod,b>>=1;
}
return fac;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr),cout.tie(nullptr);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>s;
ins(s);
}
get_fail();
int ans=0;
f[0][0]=1;
for(int i=1;i<=m;i++)
for(int j=0;j<=cnt;j++)
for(int c=0;c<26;c++)
if(!no[tr[j][c]])
f[i][tr[j][c]]=(f[i][tr[j][c]]+f[i-1][j])%mod;
for(int i=0;i<=cnt;i++) ans=(ans+f[m][i])%mod;
ans=(qpow(26,m)-ans+mod)%mod;
cout<<ans<<"\n";
return 0;
}
[题解]P4052 [JSOI2007] 文本生成器的更多相关文章
- P4052 [JSOI2007]文本生成器
P4052 [JSOI2007]文本生成器 AC自动机+dp 优秀题解传送门 设f[ i ][ j ]表示串的长度为 i ,当前在 j 点时不可识别的串的方案数 最后用总方案数减去不可识别方案数就是答 ...
- 2021.11.11 P4052 [JSOI2007]文本生成器(AC自动机+DP)
2021.11.11 P4052 [JSOI2007]文本生成器(AC自动机+DP) https://www.luogu.com.cn/problem/P4052 题意: JSOI 交给队员 ZYX ...
- [洛谷P4052][JSOI2007]文本生成器
题目大意:有$n$个字符串$s_i$,问有多少个长度为$m$的字符串至少包含$n$个字符串中的一个,字符集 A-Z .$s_i,m\leqslant100,n\leqslant60$ 题解:$AC$自 ...
- 洛谷P4052 [JSOI2007]文本生成器 AC自动机+dp
正解:AC自动机+dp 解题报告: 传送门! 感觉AC自动机套dp的题还挺套路的,,, 一般就先跑遍AC自动机,然后就用dp dp的状态一般都是f[i][j]:有i个字符,是ac自动机上的第j个节点, ...
- 洛谷P4052 [JSOI2007]文本生成器(AC自动机)
传送门 好像这题的确只能用AC自动机做了……Aufun大佬太强啦 正着难我们反着做,用总共单词个数减去没有一个单词都不包含的 然后考虑怎么处理一个单词都不包含的,就是跑不到单词的结尾节点 定义$f[i ...
- 落谷 P4052 [JSOI2007]文本生成器
题目链接.只要有一个可读就行,容斥会好做一点. 可读数量 \(=\) 总数 \(-\) 不可读数量 总数显然是 \(26 ^ n\). 求解不可读数量 不可读数量可以利用 AC 自动机的模型进行 DP ...
- BZOJ 1030 [JSOI2007]文本生成器
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2624 Solved: 1087[Submit][Stat ...
- 2781: [JSOI2007]文本生成器
2781: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 8 Solved: 4[Submit][Status][We ...
- 【BZOJ1030】[JSOI2007]文本生成器 AC自动机+动态规划
[BZOJ1030][JSOI2007]文本生成器 Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文 ...
- BZOJ 1030: [JSOI2007]文本生成器 [AC自动机 DP]
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3953 Solved: 1614[Submit][Stat ...
随机推荐
- .NET周刊【5月第4期 2025-05-25】
国内文章 .NET 的全新低延时高吞吐自适应 GC - Satori GC https://www.cnblogs.com/hez2010/p/18889954/the-new-satori-gc-f ...
- Select 组件实现【全选】(基于 Element)
〇.前言 在 Element 中,Select 组件支持单选和多选,但是并没有全选的属性,因此只能通过其事件和属性来实现,本文将实现一个简单的示例. 注意:本文的示例中,通过 leixing1 来兼容 ...
- 袋鼠云:基于Flink构建实时计算平台的总体架构和关键技术点
数栈是云原生-站式数据中台PaaS,我们在github和gitee上有一个有趣的开源项目:FlinkX,FlinkX是一个基于Flink的批流统一的数据同步工具,既可以采集静态的数据,也可以采集实时变 ...
- 20250620 - Bonding 攻击事件: 项目方不创建的池子由我攻击者来创建
背景信息 本次攻击涉及 Bonding 和 LBM 两种代币,用户可以通过 Bonding.buy() 用 USDC 购买 Bonding,当 Bonding 合约中的 USDC 累积超过一定阈值时会 ...
- Potree 004 点云点大小形状设置
点云数据就是靠海量的点显示来模拟真实世界的.点大小设置就比较重要,例如如果数据稀疏,点显示的时候,可以设置稍微大一些.如果点数据比较密集,则可以显示小一些. 在Potree中,点云定义为PointCl ...
- CF650A 题解
Problem 原题链接 Meaning 求曼哈顿距离和欧氏距离相等的坐标组数量. Solution 这道题用枚举复杂度较高,我们考虑探究当两点的曼哈顿距离与欧氏距离相等时,它们横纵坐标的关系. 如下 ...
- Elastic学习之旅 (12) .NET 6应用集成ES - 下
大家好,我是Edison. 上一篇:.NET集成ES进行CRUD 写在开头 在.NET应用中集成ES一般涉及两个方面: (1)将ES当存储用,类似于MongoDB,做文档的增删查改,这一类操作偏CRU ...
- C# winform 打开设计时,也会执行编写的代码,
if (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv")//判断是否为设计时 { re ...
- Django+DRF 实战:自定义异常处理流程
一.DRF 异常处理流程 DRF 默认异常处理流程 DRF默认的异常处理流程如下: 当异常发生时,会自动调用rest_framework.views.exception_handler 函数来处理异常 ...
- 抓取微信小程序源码
想成为一名微信小程序的开发者,前端思路的学习和安全意识是非常有必要的,故务必掌握小程序反编译技能. 这里用到了2个工具<包解密>与<反编译>(非原创,均来自网上的大佬),特别适 ...