P4569 [BJWC2011] 禁忌♂题解

news/2025/3/17 23:28:32/文章来源:https://www.cnblogs.com/lewisak/p/18777974

传送门

我的板蓝根

前言

这个题的数据范围及其出卖解法,其实很简单。

题目大意

定义一个字符串的权值为将其分割后子串与 \(N\) 个文本串相等个数的最大值,求:在由前 \(alphabet\) 个小写字母组成的长度为 \(len\) 的任意字符串中随机选择出的字符串的期望权值。

题解

看到这个题第一反应是一个常用小技巧:为了减小误差,把期望拆成权值和除以总方案数,然后看一眼数据范围:\(len \le 10^9\),直接就死了。

但是这也启示了我们:能通过 \(10^9\) 级别的算法,要么复杂度根本不带 \(len\) 要么是 \(\log\) 级别的,考虑后者发现只有矩阵快速幂看起来比较可行。

然后再看到 \(N \le 5\) 和模式串的长度不超过 \(15\),那这应该就是矩阵的宽了。

注意到样例说 \(\text {aabb}\) 不能拆成 \(\text {aa}\)\(\text {abb}\),也就是说一个字节不能给多次贡献,于是有一个很有意思的伪做法就是将文本串“堆”起来,然后转移是要么在 \(i-len\) 的位置“堆”一个文本串,要么放杂的字符,比如下图是一种权值为4的情况:

但如果杂字符联合成了一个文本串就废了,而且拆成 \(\text {ab}\) 不如拆成 \(\text {a}\)\(\text {b}\),如过有这种情况也会废,但这个伪做法启示我们文本串匹配成功后就要从头开始匹配。

于是我们考虑一个文本匹配多个模式看着就像是 AC 自动机,进一步考虑 AC 自动机上 dp。

\(dp_{i,j}\) 表示从 \(i\) 出发走 \(j\) 步的期望,然后受伪做法的启发,如果匹配成功了就要从根节点从新开始匹配,也就是有转移:

\[dp_{i_j}=\frac{1}{alphabet} \left ( \sum_{flag_v=1} \left(dp_{1,j-1}+1\right)+\sum_{flag_v=0} dp_{v,j-1}\right ) \]

其中 \(v\)\(i\) 在 AC 自动机上的子节点,\(flag_i\) 表示到 \(i\) 有没有后缀是文本串,然后矩阵快速幂优化即可。

代码

#include<bits/stdc++.h>
#define LF long double
using namespace std;
namespace FFF{
const int mod=1e4+7;
struct AAA{int son[30],flag,fail;
}tr[100100];
struct QQQ{LF mapp[110][110];int x,y;
}a;
int n,m,cnt=1,ans,alp,len;
char s[100100];
queue<int> q;
void insert(char s[]){int u=1,len=strlen(s);for(int j=0;j<len;j++){int v=s[j]-'a';if(!tr[u].son[v]){tr[u].son[v]=++cnt;}u=tr[u].son[v];}tr[u].flag=1;
}
void init(){for(int i=0;i<26;i++){tr[0].son[i]=1;}q.push(1);while(!q.empty()){int u=q.front(),f=tr[u].fail;q.pop();for(int i=0;i<26;i++){int v=tr[u].son[i];if(!v){tr[u].son[i]=tr[f].son[i];continue;}tr[v].fail=tr[f].son[i];tr[v].flag|=tr[tr[v].fail].flag;q.push(v);}}
}
QQQ cheng(QQQ x,QQQ y){QQQ ans;for(int i=1;i<=x.x;i++){for(int j=1;j<=x.x;j++){ans.mapp[i][j]=0.0;}} for(int i=1;i<=x.x;i++){for(int j=1;j<=x.x;j++){for(int k=1;k<=x.y;k++){ans.mapp[i][j]+=(LF)x.mapp[i][k]*y.mapp[k][j];}}}ans.x=ans.y=x.x;return ans;
}
QQQ qpow(QQQ x,int y){QQQ aaa=x;y--;while(y){if(y&1){aaa=cheng(aaa,x);}x=cheng(x,x);y>>=1;}return aaa;
}
string main(){cin>>n>>len>>alp;for(int i=1;i<=n;i++){cin>>s;insert(s);}init();a.x=a.y=cnt+1;a.mapp[cnt+1][cnt+1]=1;for(int i=1;i<=cnt;i++){for(int j=0;j<alp;j++){if(tr[tr[i].son[j]].flag){a.mapp[i][1]+=1.0/(LF)alp;a.mapp[i][cnt+1]+=1.0/(LF)alp;}else{a.mapp[i][tr[i].son[j]]+=1.0/(LF)alp;}}}a=qpow(a,len);
//	cout<<a.mapp[1][cnt+1];printf("%Lf",a.mapp[1][cnt+1]);return "woshiyuanshenwanjia!!!";
}
}
signed main(){FFF::main();return 0;
}

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

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

相关文章

微服务存在的问题及解决方案

微服务存在的问题及解决方案 1. 存在问题 1.1 接口拖慢 因为一个接口在并发时,正好执行时长又比较长,那么当前这个接口占用过多的 Tomcat 连接,导致其他接口无法即时获取到 Tomcat 连接来完成请求,导致接口拖慢,甚至失败。 假如商品服务业务并发较高,占用过多 Tomcat 连接…

Esay_log移植

1. 目录结构demo 包含多平台移植示例,如 Linux、RT-Thread、裸机系统等,提供实际工程参考,帮助开发者快速适配不同环境。docs 存放中英文文档,详细说明库的配置、API 接口、移植方法及插件扩展机制。关键文档包括:api/kernel.md:核心接口函数定义及使用说明。port/kernel…

The sunshine in my life--Sun Yingsha

Have you ever been stuck in the mud, unable to move? I was once that person until Sun Yingsha’s story illuminated my path. During the epidemic period, exposed to various electronic devices, I was addicted to online games. Time slipped through my fingers …

工具-typora 字数太多卡顿问题

进入设置打开高级设置在文件夹中编辑 配置文件修改 flags 后面的内容 "flags": [] 为 "flags": [["disable-gpu"],] 如图保存后重启 typora

Python实验一报告

学号 20233309 《Python程序设计》实验一报告课程:《Python程序设计》班级:2333姓名:侯成子学号:20233309实验教师:王志强实验日期:2025年3月12日必修/选修:公选课一、实验内容1.熟悉Python开发环境;2.练习Python运行、调试技能;3.编写程序,练习变量和类型、字符串…

第03章 基本的SELECT语句

第03章 基本的SELECT语句 1. SQL概述 1.1 SQL背景知识SQL(Structured Query Language,结构化查询语言)是使用关系模型的数据库应用语言。 SQL有两个重要的标准:SQL92和SQL99。1.2 SQL分类DDL(Data Definition Languages):定义数据库对象,这些语句定义了不同的数据库、表…

Transformer(自然语言处理)笔记

Transerformer架构(自然语言处理) 尝试学习和从零构建一个大语言模型就目前我的认知 Transformer架构主要分为编码器、解码器、词表、训练集、训练算法(T5) 编码器(Encoder) Encoder主要负责将输入转换为计算机能够理解的内容(也就是词表中的向量词元) 解码器(Decoder) 将词…

20241101 实验一《Python程序设计》实验报告”

20241101 2024-2025-2 《Python程序设计》实验一报告 课程:《Python程序设计》 班级:2411 姓名:苏萱 学号:20241101 实验教师:王志强 实验日期:2025.3.12 必修/选修: 公选课 1.实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能;(编写书中的程序,并进行…

Android 12 启用USAP

USAP是安卓10起携带的一个用来加快应用冷启动速度的功能。正常的情况下,你只需要设置属性persist.device_config.runtime_native.usap_pool_enabled为true即可启用该功能。 但是可能是因为这个功能默认是不开的,实际上Android 12有BUG导致功能不生效,谷歌也没人发现。 实际使…

高铁站智能监控预警系统

高铁站智能监控预警系统实时检测高铁出站口人员逆行预警,提示管理者及时阻止,可降低火车站安全事故。在出站口梯部署科缔欧AI智能分析识别预警摄像机,获取出站及附近的画面,摄像机集成算法,分析旅客逆行等各类事件,将原始数据和算法产生的分析数据传输至后台。当有旅客从…

第1个必会服务-定时任务

1.定时任务注意事项(箴言) 1.1.增加注释 书写定时任务的时候,尽量添加上一个注释. 用于说明这条定时任务作用. 1.2.尽量使用脚本 定时任务未来避免一些故障,推荐使用脚本.调试脚本的方法: sh -x 或bash -x ,显示脚本执行过程. 有+开头的表示脚本背后执行的过程. 如果开头没有+,…