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 ...
随机推荐
- git flow版本
feature 分支:开发者进行功能开发的分支. develop 分支:对开发的功能进行集成的分支. release 分支:负责版本发布的分支. hotfix 分支:对线上缺陷进行修复工作的分支,热修 ...
- C# 异步锁 await async锁,lock,Monitor,SemaphoreSlim
异步方法内无法使用Monitor 和lock 所以只能用System.Threading.SemaphoreSlim了 //Semaphore (int initialCount, int maxim ...
- uwp 之后台音频
C# code 后台任务 ---------------------------- public sealed class BgTask : IBackgroundTask { #region 私有字 ...
- C#设计模式---PipeLine
一.概述 顾名思义,管道模式就像一条管道把多个对象连接起来,整体看起来就像若干个阀门嵌套在管道中,而处理逻辑就放在阀门上,如下图,需要处理的对象进入管道后,分别经过阀门一.阀门二.阀门三.阀门四,每个 ...
- Qt event()
event() 今天要说的是 event()函数.记得之前曾经提到过这个函数,说在事件对象创建完毕后,Qt 将这个事件对象传递给 QObject的 event()函数.event()函数并不直接处理事 ...
- dubbo(一)
1. Introduction 参考链接:https://www.baeldung.com/dubbo Dubbo is an open-source RPC and microservice fra ...
- Java静态内部类——重点是精妙的demo
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/cd18333612683/article/details/79129503什么是内部类大部分时候,类 ...
- 4、kubernetes基础概念
一.基础概念 1.Master节点 整个集群的控制中枢.Master节点是Kubernetes集群的控制节点,在生产环境中不建议部署集群核心组件外的任何Pod,公司业务的Pod更是不建议部署到Mast ...
- Go: 复合数据类型slice
slice slice 表示用于相同类型元素的可变长度的序列. slice有三个属性:指针.长度和容量. 指针:slice存储数据的内部结构是数组,指针指向的是数组的地址 长度:保存slice中的元素 ...
- jmeter实际场景应用之测试上传excel文件
日常工作上测试的时候,会有一些场景是导入/上传文件.我们系统多是excel文件,这里就用excel文件为例,详述一下此次测试遇到的坑.最终结果是成功的,请看到最后! 1.获取接口的一些参数信息 先按F ...