P3706-[SDOI2017]硬币游戏【高斯消元,字符串hash】
正题
题目链接:https://www.luogu.com.cn/problem/P3706
题目大意
给出 \(n\) 个长度为 \(m\) 的 \(H/T\) 串。
开始一个空序列,每次随机在后面加一个 \(H/T\) ,求每个串第一次出现的概率。
\(1\leq n,m\leq 300\)
解题思路
数据范围显然不能在AC自动机上高斯消元,所以得考虑别的方法。
考虑一个很妙的做法,设一个状态\(N\)表示目前还没有匹配完成的串,然后考虑串\(A=HHT\)和串\(B=THH\),那么在\(N\)后面直接插入一个\(A\)的概率就是\(p(N+A)=p(N)\times 2^{-m}\)
但是考虑到有可能\(N\)先拼出了\(B\)然后再拼出\(A\),此时考虑\(B\)的后缀对应\(A\)前缀的有\(H,HH\)。那么就有
\]
这样不难发现对于别的串如果它的一些后缀是这个串的前缀那么就会产生一些概率,用字符串\(hash\)匹配即可。
然后会发现还是少了一个方程,最后一个就是所有串的概率和为\(1\)就好了。
这样就有\(n+1\)个方程了。
时间复杂度:\(O(n^2m+n^3)\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ull unsigned long long
using namespace std;
const int N=310;
const ull g=131;
int n,m;
double a[N][N],b[N],pw[N];
ull h[N][N],p[N];char s[N];
ull geth(int x,int l,int r)
{return h[x][r]-h[x][l-1]*p[r-l+1];}
void Gauss(int n){
for(int i=1;i<=n;i++){
int z=i;
for(int j=i+1;j<=n;j++)
if(a[j][i]>a[z][i])z=i;
swap(a[i],a[z]);
double x=a[i][i];b[i]/=x;
for(int j=i;j<=n;j++)a[i][j]/=x;
for(int j=i+1;j<=n;j++){
double rate=-a[j][i];
for(int k=i;k<=n;k++)
a[j][k]+=rate*a[i][k];
b[j]+=rate*b[i];
}
}
for(int i=n;i>=1;i--){
for(int j=1;j<i;j++){
b[j]-=a[j][i]*b[i];
a[j][i]=0;
}
}
return;
}
int main()
{
scanf("%d%d",&n,&m);p[0]=1;pw[0]=1;
for(int i=1;i<=m;i++)
pw[i]=pw[i-1]*0.5,p[i]=p[i-1]*g;
for(int i=1;i<=n;i++){
scanf("%s",s+1);
for(int j=1;j<=m;j++)
h[i][j]=h[i][j-1]*g+s[j];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=m;k++)
if(geth(i,1,k)==geth(j,m-k+1,m))
a[i][j]+=pw[m-k];
for(int i=1;i<=n;i++)
a[i][n+1]=-pw[m],a[n+1][i]=1;
b[n+1]=1;Gauss(n+1);
for(int i=1;i<=n;i++)
printf("%.12lf\n",b[i]);
return 0;
}
P3706-[SDOI2017]硬币游戏【高斯消元,字符串hash】的更多相关文章
- [BZOJ 4820] [SDOI2017] 硬币游戏(高斯消元+概率论+字符串hash)
[BZOJ 4820] [SDOI2017] 硬币游戏(高斯消元+概率论+字符串hash) 题面 扔很多次硬币后,用H表示正面朝上,用T表示反面朝上,会得到一个硬币序列.比如HTT表示第一次正面朝上, ...
- [Sdoi2017]硬币游戏 [高斯消元 KMP]
[Sdoi2017]硬币游戏 题意:硬币序列,H T等概率出现,\(n \le 300\)个人猜了一个长为$ m \le 300$的字符串,出现即获胜游戏结束.求每个人获胜概率 考场用了[1444: ...
- [BZOJ4820][SDOI2017]硬币游戏(高斯消元+KMP)
比较神的一道题,正解比较难以理解. 首先不难得出一个(nm)^3的算法,对所有串建AC自动机,将在每个点停止的概率作为未知数做高斯消元即可. 可以证明,AC自动机上所有不是模式串终止节点的点可以看成一 ...
- 洛咕 P3706 [SDOI2017]硬币游戏
假设f[i]是第i个同学胜利的概率,也就是随机序列第一个匹配到s[i]的概率 假设前面有一个字符串\(S\),(假设无限长但没有匹配),现在往后面要加上第i个串\(s[i]\),这个的概率设为\(P_ ...
- 【bzoj3105】[cqoi2013]新Nim游戏 高斯消元求线性基
题目描述 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴,但不能同时从 ...
- BZOJ 3105: [cqoi2013]新Nim游戏 [高斯消元XOR 线性基]
以后我也要用传送门! 题意:一些数,选择一个权值最大的异或和不为0的集合 终于有点明白线性基是什么了...等会再整理 求一个权值最大的线性无关子集 线性无关子集满足拟阵的性质,贪心选择权值最大的,用高 ...
- 洛谷P3706 [SDOI2017]硬币游戏(概率生成函数+高斯消元)
题面 传送门 题解 不知道概率生成函数是什么的可以看看这篇文章,题解也在里面了 //minamoto #include<bits/stdc++.h> #define R register ...
- BZOJ 2466 中山市选2009 树 高斯消元+暴力
题目大意:树上拉灯游戏 高斯消元解异或方程组,对于全部的自由元暴力2^n枚举状态,代入计算 这做法真是一点也不优雅... #include <cstdio> #include <cs ...
- BZOJ:4820: [Sdoi2017]硬币游戏&&BZOJ:1444: [Jsoi2009]有趣的游戏(高斯消元求概率)
1444: [Jsoi2009]有趣的游戏 4820: [Sdoi2017]硬币游戏 这两道题都是关于不断随机生成字符后求出现给定字符串的概率的问题. 第一题数据范围较小,将串建成AC自动机以后,以A ...
随机推荐
- Vmware15的安装以及Ubunt的在虚拟机上的安装
一.vmware15安装 1.百度网盘地址 链接:https://pan.baidu.com/s/1Lgez57n50QEW97HNdYZCfQ 提取码:9wvy 2.下载到本地后 3.双击安装程序 ...
- NGINX Ingress控制器1.0.0升级迁移文档(翻译)
Ingress 是什么 Ingress 是对k8s集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP. Ingress 可以提供负载均衡.SSL 终结和基于名称的虚拟托管. 最近 ...
- C++11 weak_ptr智能指针
和 shared_ptr.unique_ptr 类型指针一样,weak_ptr 智能指针也是以模板类的方式实现的.weak_ptr<T>( T 为指针所指数据的类型)定义在<memo ...
- C++ 计算MD5
头文件: #pragma once #ifndef MD5_H #define MD5_H #include <string> #include <fstream> /* Ty ...
- Spring详解(二)------注解配置IOC
@Configuration:告诉Spring这是一个配置类 @Bean("person")-->作用于方法:给容器中注册一个Bean;类型为返回值的类型 @Componen ...
- Java 方法使用
那么什么是方法呢? Java方法是语句的集合,它们在一起执行一个功能. 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 方法的优点 1. 使程序变得更简 ...
- (三)air202连接阿里云上传静态数据
具体步骤跳转–合宙官网 air202luat二次开发设备接入阿里云(一) air202luat二次开发设备接入阿里云(二) air202luat二次开发设备接入阿里云(三) 可能遇到的问题 群文件中有 ...
- 最全华为鸿蒙 HarmonyOS 开发资料汇总
开发 本示例基于 OpenHarmony 下的 JavaScript UI 框架,进行项目目录解读,JS FA.常用和自定义组件.用户交互.JS 动画的实现,通过本示例可以基本了解和学习到 JavaS ...
- MySQL日志系统bin log、redo log和undo log
MySQL日志系统bin log.redo log和undo log 今人不见古时月,今月曾经照古人. 简介:日志是MySQL数据库的重要组成部分,记录着数据库运行期间各种状态信息,主要包括错误日 ...
- 基于源码编译的lnmp架构实现论坛的搭建及memcache的应用
系统环境: RHEL6 x86-64 selinux and iptables disabled LNMP代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构 Linux是一类 ...