【题解】Luogu P4569 [BJWC2011] 禁忌

news/2025/2/6 20:13:31/文章来源:https://www.cnblogs.com/zhangxyhp/p/18701618

考虑如果暴力 DP 的话,时间复杂度会超标,于是矩阵加速。

但是在 DP 的过程中,期望又要乘又要加的,用矩阵很难转移。于是考虑用矩阵去算概率,新开一行去存期望。

这个贪心是很显然的:当匹配完了一个单词时,直接从头开始尝试匹配下一个单词。由于题目要求不能重叠,这不仅是策略上的优化还是正确性的保证。

具体地,假设要从节点 \(j\) 转移到 \(k\),如果 \(k\) 是某个单词的结尾,那就把贡献加给根,同时加给期望。否则就只能加给 \(k\) 了。

时间复杂度 \(O((\sum|T_i|)^3\log len)\)

#include<bits/stdc++.h>
#define ll long long
#define il inlineusing namespace std;
namespace asbt{
namespace cplx{bool begin;}
int n,m,tr[80][30];
int tot,fail[80];
long double ab;
bool end[80];
string s;
queue<int> q;
struct juz{long double mat[80][80];juz(){for(int i=0;i<=tot;i++){for(int j=0;j<=tot;j++){mat[i][j]=0;}}}il long double*operator[](int x){return mat[x];}il juz operator*(juz x)const{juz res;for(int i=0;i<=tot;i++){for(int j=0;j<=tot;j++){for(int k=0;k<=tot;k++){res[i][j]+=mat[i][k]*x[k][j];}}}return res;}
}bas;
il juz qpow(juz x,int y){juz res;for(int i=0;i<=tot;i++){res[i][i]=1;}while(y){if(y&1){res=res*x;}y>>=1,x=x*x;}return res;
}
namespace cplx{bool end;il double usdmem(){return (&begin-&end)/1048576.0;}
}
int main(){ios::sync_with_stdio(0),cin.tie(0);cin>>n>>m>>ab;for(int i=1,p;i<=n;i++){cin>>s;p=0;for(int j=0,d;j<s.size();j++){d=s[j]-'a';if(!tr[p][d]){tr[p][d]=++tot;}p=tr[p][d];}end[p]=1;}for(int i=0;i<ab;i++){if(tr[0][i]){q.push(tr[0][i]);}}while(q.size()){int u=q.front();q.pop();for(int i=0;i<ab;i++){if(tr[u][i]){fail[tr[u][i]]=tr[fail[u]][i];end[tr[u][i]]|=end[fail[tr[u][i]]];q.push(tr[u][i]);}else{tr[u][i]=tr[fail[u]][i];}}}
//	for(int i=0;i<=tot;i++){
//		cout<<fail[i]<<" ";
//	}
//	puts("");tot++;for(int i=0;i<tot;i++){for(int j=0;j<ab;j++){if(end[tr[i][j]]){bas[i][0]+=1.0l/ab;bas[i][tot]+=1.0l/ab;}else{bas[i][tr[i][j]]+=1.0l/ab;}}}bas[tot][tot]=1;printf("%.10Lf",qpow(bas,m)[0][tot]);return 0;
}
}
int main(){return asbt::main();}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/879793.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kotlin空安全

前言 访问空引用的成员变量就会导致空指针异常,在Java中被称作NullPointerException,简称NPE,Kotlin中NPE产生的原因只可能是以下几种:显式调用 throw NullPointerException()使用了!!操作符数据在初始化时不一致,例如:传递一个在构造函数中出现的未初始化的 this 并用于…

Kotlin控制流程

条件与循环 if表达式 Kotlin中的if与Java中的if大致上都差不多,但是Kotlin中没有三元运算符(A ? B : C),可以用if表达式作为代替,例如: Java int a = int a = System.currentTimeMillis() % 2 == 1L ? 1 : 0; Kotlin val a = if (System.currentTimeMillis() % 2 == 1L…

第一次用Markdown

标题 标题2 标题3 标题4 字体 字体 字体姓名 性别 年龄张三 男 20![das]() baidu

【测试基础】web3.0介绍

web3.0介绍 Web3.0也被称为下一代互联网,是对当前互联网(Web2.0)的演进和升级。其目标是实现一个更加去中心化、安全、用户拥有数据主权且具有更好互操作性的互联网环境。Web3.0的核心技术包括区块链、智能合约和加密货币等。 web2.0与web3.0区别 Web2.0和Web3.0的主要区别在…

区块链原理、技术与实践

区块链介绍 区块链是一种分布式账本技术,允许多个参与者共同维护一个不断增长的数据记录列表,每个区块包含一系列交易记录,并通过密码学方法与前一个区块链接起来,形成一个不可篡改和不可逆的链条。 这种基于共识的机制使得区块链具有高度的安全性和透明性。 区块链与传统W…

《高效能人士的七个习惯》

情感账户 勇气和体谅 大石头 自传式回应、同理心倾听:用你的话反映他们的感受和意思,而不是去评论、去判断是否正确

高效能人士的七个习惯

情感账户 勇气和体谅 大石头 自传式回应、同理心倾听:用你的话反映他们的感受和意思,而不是去评论、去判断是否正确

新春“码”启 | Cocos 3D 微信小游戏(第5天):分包构建和上传发布(完美收官)

新春开发 Cocos 3D 微信小游戏计划的第 5 天,详细介绍了如何利用Cocos Creator开发并发布一款3D微信小游戏,包括游戏状态机的设计理念,和微信小游戏主包大小限制时的解决方案——分包策略。从游戏设计、开发、调试到最后成功发布的全过程,为想要进入微信小游戏开发领域的开…

爬虫随笔(一)

爬虫随笔,某牛前几天一直在看js逆向,现在分享一下本人近期学习记录首先分享一个网站,这个网站可以获得request所需要的header和cookie https://curlconverter.com/ 爬取网站就不挂了简单观察发现,该网站是滑动加载,我们可以在滑动加载时获得我们所需要的接口,发现两个链…

Flow-CLI 全新升级,轻松对接 Sonar 实现代码扫描和红线卡点

Flow-CLI 使用的典型场景如:自定义开发一个 Sonar 扫描步骤,以在流水中触发 Sonar 扫描,并以扫描结果作为红线卡点,以保证代码质量;对接三方自有审批平台,在发布前进行检查审批,审批通过才允许发布。场景介绍 Flow-CLI 是云效流水线 Flow 推出的一款命令行工具,帮助用户…

皮克定理

小蓝鸟的面积S=B/2+I-1

两步构建 AI 总结助手,实现智能文档摘要

本次解决方案将向您介绍,如何通过函数计算 FC 阿里云百炼平台搭建智能 AI 总结助手,实现高效的文本自动总结和信息提取。在信息极度丰富的当下,如何从海量且复杂的文件资料中筛选出关键内容,成为了不少企业和个人急需解决的问题。本次解决方案将向您介绍,如何通过函数计算…