【BZOJ4820】[SDOI2017]硬币游戏(高斯消元)

题面

BZOJ
洛谷

题解

第一眼的感觉就是构\(AC\)自动机之后直接高斯消元算概率,这样子似乎就是\(BZOJ1444\)了。然而点数太多了,三方的消元没法做。
考虑如何优化点数,首先我们的所有点可以分为两种,一种是终止节点,另外一种则不是。
既然现在要某一个串出现,因此我们唯一需要考虑的是到达终止节点的情况。设\(f_i\)表示到达第\(i\)个串的终止位置,并且没有到达过其他终止节点的概率,也就是第\(i\)个串的答案。设\(f_0\)表示没有到达任何一个串终止位置的概率。
那么显然的,要到达当前位置,我们一种可行的方法就是在没有匹配上任何一个串的串后面接上当前串,那么概率就是\(f_0*\frac{1}{2^m}\),然而这个东西显然会比\(f_i\)要大,因为这个终止串再接上当前串可能包含了其他的串\(j\),而\(f_0\)表示的串没有匹配上任何一个串,意味着\(j\)的后缀是\(i\)的前缀。那么考虑所有其他串与当前串前后缀的匹配长度\(k\),我们可以列出方程:
\[f_0*\frac{1}{2^m}=f_i+\sum_j f_j*\frac{1}{2^{m-k}}\]
而然这样子是\(n+1\)元,\(n\)个方程,再利用\(\sum f_i=1\)补足最后一个方程即可。
好神仙啊。

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
#define ll long long
#define ull unsigned long long
#define MAX 320
const ull base=233;
inline int read()
{int x=0;bool t=false;char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=true,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return t?-x:x;
}
int n,m;char ch[MAX];
ull h[MAX][MAX],pw[MAX];
ull geths(int x,int l,int r){return h[x][r]-h[x][l-1]*pw[r-l+1];}
double g[MAX][MAX],bin[MAX];
void Guass()
{for(int i=0;i<=n;++i){int p=i;for(int j=i+1;j<=n;++j)if(fabs(g[j][i])>fabs(g[p][i]))p=j;swap(g[p],g[i]);double t=g[i][i];for(int j=i;j<=n+1;++j)g[i][j]/=t;for(int j=i+1;j<=n;++j){double t=g[j][i];for(int k=0;k<=n+1;++k)g[j][k]-=g[i][k]*t;}}for(int i=n;i;--i){g[i][n+1]/=g[i][i];for(int j=i-1;j;--j)g[j][n+1]-=g[i][n+1]*g[j][i];}
}
int main()
{n=read();m=read();pw[0]=bin[0]=1;for(int i=1;i<=m;++i)pw[i]=pw[i-1]*base,bin[i]=bin[i-1]/2;for(int i=1;i<=n;++i){scanf("%s",ch+1);for(int j=1;j<=m;++j)h[i][j]=h[i][j-1]*base+ch[j];}g[0][n+1]=1;for(int i=1;i<=n;++i){g[0][i]=1;g[i][0]=-bin[m];for(int j=1;j<=n;++j)for(int k=1;k<=m;++k)if(geths(i,1,k)==geths(j,m-k+1,m))g[i][j]+=bin[m-k];}Guass();for(int i=1;i<=n;++i)printf("%.10lf\n",g[i][n+1]);return 0;
}

转载于:https://www.cnblogs.com/cjyyb/p/10076926.html

【BZOJ4820】[SDOI2017]硬币游戏(高斯消元)相关推荐

  1. bzoj4820 [Sdoi2017]硬币游戏 高斯消元+概率+kmp

    有环的概率是可以高斯消元的 由于匹配情况可能从一个串转移到另一个串,所以需要建一个转移关系的图 就可以建一个ac自动机,但节点数是nm的.就可以设未知数,然后凑一些方程. 设N表示没有任何人获胜的概率 ...

  2. [Sdoi2017]硬币游戏 [高斯消元 KMP]

    [Sdoi2017]硬币游戏 题意:硬币序列,H T等概率出现,\(n \le 300\)个人猜了一个长为$ m \le 300$的字符串,出现即获胜游戏结束.求每个人获胜概率 考场用了[1444: ...

  3. BZOJ4820 [SDOI2017]硬币游戏

    BZOJ4820 [SDOI2017]硬币游戏 题面:BZOJ 解析 考虑把所有没有到达结束状态的字符串看做一类字符串\(N\),把以字符串\(i\)作为结束的一类字符串\(i\).现在假设猜测了两个 ...

  4. bzoj4820[SDOI2017]硬币游戏

    题意 给出n个长度均为m的不同01串,随机生成一个无限长的01串,对n个01串中的每个,求出它最先在随机串中出现的概率. 分析 写这个题的题解比写这个题还难...我可能学了假的概率DP...假装我理解 ...

  5. BZOJ 2466 中山市选2009 树 高斯消元+暴力

    题目大意:树上拉灯游戏 高斯消元解异或方程组,对于全部的自由元暴力2^n枚举状态,代入计算 这做法真是一点也不优雅... #include <cstdio> #include <cs ...

  6. BZOJ:4820: [Sdoi2017]硬币游戏BZOJ:1444: [Jsoi2009]有趣的游戏(高斯消元求概率)

    1444: [Jsoi2009]有趣的游戏 4820: [Sdoi2017]硬币游戏 这两道题都是关于不断随机生成字符后求出现给定字符串的概率的问题. 第一题数据范围较小,将串建成AC自动机以后,以A ...

  7. bzoj 4820: [Sdoi2017]硬币游戏 概率dp+高斯消元+KMP

    题意 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利. 大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬币实在是太单调了. 同学们觉得要加强趣味性,所以要找一个同学扔很多 ...

  8. BZOJ.4820.[SDOI2017]硬币游戏(思路 高斯消元 哈希/AC自动机/KMP)

    BZOJ 洛谷 建出AC自动机,每个点向两个儿子连边,可以得到一张有向图.参照 [SDOI2012]走迷宫 可以得到一个\(Tarjan\)+高斯消元的\(O((nm)^3)\)的做法.(理论有\(6 ...

  9. 【SDOI2017】硬币游戏【KMP】【概率期望】【高斯消元】

    题意:给 nnn 个长度为 mmm 的 01 串,一个 01 串初始为空,不断随机一个字符加在后面,当出现给定的 nnn 个串中的一个时停止.分别求在 nnn 个串处停止的概率. 考场思路历程: 显然 ...

最新文章

  1. WinDBG调试dNet程序总结
  2. C# foreach循环较for循环的优势与劣势
  3. 51单片机怎么显示当前时间_单片机初学者必看
  4. 【转】WPF从我炫系列3---内容控件的用法
  5. c语言中输入字符用什么作用是什么意思,C语言编程问题
  6. cisco 的网络地址转换技术(NAT)
  7. mysql 碎片率_为什么所有MySQL InnoDB表都碎片化了?
  8. 如何设置照片的高度没有滚条_10分钟看懂Photoshop 照片修饰(照片修复工具)
  9. 零基础学sql要多久_零基础如何学习游戏3D建模,要学些什么内容?学多久?
  10. Video Matting:AI视频抠图
  11. 2021年Web前端开发的趋势有哪些
  12. python与数据挖掘课后实验答案_数据仓库与数据挖掘课后习题答案
  13. 将指定 Word 的页眉页脚复制到其他文件中
  14. CMD到底是啥?有啥用?
  15. vim 常用命令 挺全的
  16. 两种常见的周期性特征,时序必知强特
  17. 解决ionic 中 $ionicHistory.goBack()无法返回问题
  18. Cocos2dx版本介绍【至3.10版】
  19. 三菱编程软件GX Works2复制粘贴错位
  20. (01)ORB-SLAM2源码无死角解析-(55) 闭环线程→计算Sim3:总体流程讲解ComputeSim3()

热门文章

  1. 配置 LBaaS - 每天5分钟玩转 OpenStack(121)
  2. Windows 7安全补丁KB3110329遭遇更新失败 且暂无解决方法
  3. 腾讯云使用Python发邮件
  4. Vista中使用率最高的11条命令
  5. 说实话,你工作5年,不知道什么是Java agent技术,让我很吃惊...
  6. 反应式编程在微服务下的重生
  7. 周围的餐馆有哪些?GeoHash算法
  8. 通俗说基于Yarn的Map-Reduce过程
  9. 过了所有技术面,却倒在 HR 一个问题上。。
  10. Java:main()函数调用类中方法的限制