洛咕 P3706 [SDOI2017]硬币游戏
假设f[i]是第i个同学胜利的概率,也就是随机序列第一个匹配到s[i]的概率
假设前面有一个字符串\(S\),(假设无限长但没有匹配),现在往后面要加上第i个串\(s[i]\),这个的概率设为\(P_i\)。因为所有s[i]长度一样,所以每个\(P_i\)都相等。
S
s[i]
现在在\(S\)后面加\(s[i]\)的时候,可能先匹配到了别的串
S
s[i]
s[j]
假设\(S\)与\(s[j]\)的匹配长度为\(a\),\(s[i]\)与\(s[j]\)的匹配长度为\(b\),因为\(S\)不确定,所以长度为\(a\)那一段匹配到的概率是\(2^{-a}\)
列出式子来,就是:
\(P=P_i=\sum_{j=1}^n\sum_{k=1}^{m}[s[j][m-k+1..m]==s[i][1..k]]2^{-k}\)
很玄学是吧我也觉得很玄学
所以可以把\(P\)看做是单位1,有n个方程,每个f[i]都是一个未知数,高斯消元即可,就能算出来f[i]之间的比例了,因为所有f[i]之和为1所以就求出答案了
#include<bits/stdc++.h>
#define il inline
#define vd void
#define mod 993244853
typedef long long ll;
il int gi(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
char S[310][310];
int n,m,Base[310];
int Hash[310][310],pre[310][310],suf[310][310];
double a[310][310],ans[310],p2[310];
int main(){
n=gi(),m=gi();
Base[0]=1;for(int i=1;i<=m;++i)Base[i]=Base[i-1]*19260817ll%mod;
for(int i=1;i<=n;++i){
scanf("%s",S[i]+1);
for(int j=1;j<=m;++j)Hash[i][j]=(Hash[i][j-1]+1ll*S[i][j]*Base[j])%mod;
for(int j=1;j<=m;++j)pre[i][j]=1ll*Hash[i][j]*Base[m-j]%mod;
for(int j=1;j<=m;++j)suf[i][j]=(Hash[i][m]-Hash[i][m-j]+mod)%mod;
}
p2[0]=1;for(int i=1;i<=m;++i)p2[i]=p2[i-1]*0.5;
for(int i=1;i<=n;++i){
a[i][n+1]=1;
for(int j=1;j<=n;++j)
for(int k=1;k<=m;++k)
if(pre[i][k]==suf[j][k])
a[i][j]+=p2[m-k];
}
for(int i=1;i<=n;++i){
for(int j=i;j<=n;++j)if(fabs(a[j][i])>1e-5){std::swap(a[i],a[j]);break;}
if(fabs(a[i][i])<1e-5)continue;
for(int j=i+1;j<=n;++j){
if(fabs(a[j][i])<1e-5)continue;
double p=a[i][i]/a[j][i];
for(int k=i;k<=n+1;++k)a[j][k]=a[j][k]*p-a[i][k];
}
}
double sum=0;
for(int i=n;i;--i){
if(fabs(a[i][i])<1e-5)continue;
for(int j=i+1;j<=n;++j)a[i][n+1]-=a[i][j]*ans[j];
ans[i]=a[i][n+1]/a[i][i];sum+=ans[i];
}
for(int i=1;i<=n;++i)printf("%.10lf\n",ans[i]/sum);
return 0;
}
洛咕 P3706 [SDOI2017]硬币游戏的更多相关文章
- 洛谷P3706 [SDOI2017]硬币游戏(概率生成函数+高斯消元)
题面 传送门 题解 不知道概率生成函数是什么的可以看看这篇文章,题解也在里面了 //minamoto #include<bits/stdc++.h> #define R register ...
- 洛谷 3706 [SDOI2017]硬币游戏——思路
题目:https://www.luogu.org/problemnew/show/P3706 题解:https://blog.csdn.net/gjghfd/article/details/80355 ...
- 【BZOJ4820】[SDOI2017]硬币游戏(高斯消元)
[BZOJ4820][SDOI2017]硬币游戏(高斯消元) 题面 BZOJ 洛谷 题解 第一眼的感觉就是构\(AC\)自动机之后直接高斯消元算概率,这样子似乎就是\(BZOJ1444\)了.然而点数 ...
- BZOJ:4820: [Sdoi2017]硬币游戏&&BZOJ:1444: [Jsoi2009]有趣的游戏(高斯消元求概率)
1444: [Jsoi2009]有趣的游戏 4820: [Sdoi2017]硬币游戏 这两道题都是关于不断随机生成字符后求出现给定字符串的概率的问题. 第一题数据范围较小,将串建成AC自动机以后,以A ...
- [Sdoi2017]硬币游戏 [高斯消元 KMP]
[Sdoi2017]硬币游戏 题意:硬币序列,H T等概率出现,\(n \le 300\)个人猜了一个长为$ m \le 300$的字符串,出现即获胜游戏结束.求每个人获胜概率 考场用了[1444: ...
- 4820: [Sdoi2017]硬币游戏
4820: [Sdoi2017]硬币游戏 链接 分析: 期望dp+高斯消元. 首先可以建出AC自动机,Xi表示经过节点i的期望次数,然后高斯消元,这样点的个数太多,复杂度太大.但是AC自动机上末尾节点 ...
- BZOJ4820 Sdoi2017 硬币游戏 【概率期望】【高斯消元】【KMP】*
BZOJ4820 Sdoi2017 硬币游戏 Description 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利.大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬币实 ...
- 【BZOJ4820】[Sdoi2017]硬币游戏 AC自动机+概率DP+高斯消元
[BZOJ4820][Sdoi2017]硬币游戏 Description 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利.大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬 ...
- [BZOJ 4820] [SDOI2017] 硬币游戏(高斯消元+概率论+字符串hash)
[BZOJ 4820] [SDOI2017] 硬币游戏(高斯消元+概率论+字符串hash) 题面 扔很多次硬币后,用H表示正面朝上,用T表示反面朝上,会得到一个硬币序列.比如HTT表示第一次正面朝上, ...
随机推荐
- nopcommerce
nopcommerce是国外的一个高质量的开源b2c网站系统,基于EntityFramework4.0和MVC3.0,使用Razor模板引擎,有很强的插件机制,包括支付配送功能都是通过插件来实现的,基 ...
- windows10如何打开vhd文件
本人电脑安装了Visual Studio 2017,但是由于项目需求需要Core SDK(2.0)的版本支持,也就是2017最新版.所以现在需要利用visual Studio 2017最新版本的安装包 ...
- ABP(ASP.NET Boilerplate Project)框架探讨
从官网上下载下来带Module-Zero的abp框架. vs2015打开解决方案. 首先让系统run起来.把webconfig数据库连接改一下.启动程序. 发现报错:“本地语言指定”的错误,之后运行n ...
- winform 关于Messagebox自动定时关闭
添加一个类库MessageBoxTimeOut public class MessageBoxTimeOut { private string _caption; public void Show(s ...
- 获取本机正在使用的ipv4地址(访问互联网的IP)
[转]原文地址:http://www.cnblogs.com/lijianda/p/6604651.html 1.一个电脑有多个网卡,有线的.无线的.还有vmare虚拟的两个网卡.2.就算只有一个网卡 ...
- Huawei DHCP 中继配置实例
配置DHCP中继示例 组网需求 如图1,DHCP客户端所在的网段为10.100.0.0/16,而DHCP服务器所在的网段为202.40.0.0/16.需要通过带DHCP中继功能的设备中继DHCP报文, ...
- 基于esky实现python应用的自动升级
一.esky介绍 Esky is an auto-update framework for frozen Python applications. It provides a simple API t ...
- MySQL二进制日志文件Binlog的三种格式以及对应的主从复制中三种技术
二进制日志文件Binlog的格式主要有三种: 1.Statement:基于SQL语句级别的Binlog,每条修改数据的SQL都会保存到Binlog里面. 2.ROW:基于行级别,每一行数据的变化都会记 ...
- Hadoop HBase概念学习系列之HLog(二)
首先,明确,HRegion服务器包含两大部分:HLog和HRegion. HLog用来存储数据日志,采用的是先写日志的方式. 当用户需要更新数据的时候,数据会被分配到对应的HRegion服务器上提交修 ...
- Docker容器学习与分享05
Docker镜像操作 学完了一些最基本的操作之后,我学习了一些关于docker镜像的基本操作. 首先来学习一下从docker hub上拉取镜像,以centos镜像为例,使用docker search命 ...