题意

周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利。
大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬币实在是太单调了。
同学们觉得要加强趣味性,所以要找一个同学扔很多很多次硬币,其他同学记录下正反面情况。
用 H 表示正面朝上, 用 T 表示反面朝上,扔很多次硬币后,会得到一个硬币序列。比如HTT 表示第一次正面朝上,后两次反面朝上。
但扔到什么时候停止呢?大家提议,选出 n n n 个同学, 每个同学猜一个长度为 m m m 的序列,当某一个同学猜的序列在硬币序列中出现时,就不再扔硬币了,并且这个同学胜利。为了保证只有一个同学胜利,同学们猜的 n n n 个序列两两不同。
很快,n n n个同学猜好序列,然后进入了紧张而又刺激的扔硬币环节。你想知道,如果硬币正反面朝上的概率相同,每个同学胜利的概率是多少。
1<=n,m<=300

分析

一个十分显然的想法是建AC自动机dp然后高斯消元,但这样的话节点数是O(n^2)的,显然不能接受。
正解十分的牛逼,设变量xix_i表示第一个匹配到的目标串是第i个串的概率,多设一个变量NN表示一个目标串都匹配不到的随机串的期望长度。
设A=TTH,B=HTTA=TTH,B=HTT,p(N+A)p(N+A)表示在一个随机串后出现AA的概率。显然有p(N+A)=N∗2−mp(N+A)=N*2^{-m}。
同时还有p(N+A)=p(A)+p(B)∗2−1+p(B)∗2−2p(N+A)=p(A)+p(B)*2^{-1}+p(B)*2^{-2}。为什么呢?
有可能在随机串NN后面不停加字符的过程中没有匹配到其他目标串,概率是p(A)p(A)。注意到BB的某些后缀是AA的前缀,也就是说在加字符的过程中有可能先匹配上BB,这种情况可能是BHBH或BTHBTH,所以也要加上其对应的概率。
也就是说,若某个串BB的后缀是另一个串AA的前缀,那么它就会影响到p(N+A)p(N+A)。
这里的系数可以用kmp来预处理,然后直接高斯消元就好了。

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;typedef long double ld;const int N=305;int n,m,next[N*2];
char s[N][N],b[N*2];
ld po[N],a[N][N];double calc(int x,int y)
{for (int i=1;i<=m;i++) b[i]=s[x][i],b[i+m]=s[y][i];next[0]=-1;next[1]=0;int i=2,j=0;while (i<=m*2)if (j==-1||b[i]==b[j+1]) j++,next[i]=j,i++;else j=next[j];ld ans=0;for (int j=next[m*2];j;j=next[j]) ans+=j<=m?po[m-j]:0;return ans;
}void build()
{po[0]=1;for (int i=1;i<=m;i++) po[i]=po[i-1]*0.5;for (int i=1;i<=n;i++){a[i][n+1]=-po[m];a[n+1][i]=1;for (int j=1;j<=n;j++)a[i][j]+=calc(i,j);}a[n+1][n+2]=1;
}void gauss(int n)
{for (int i=1;i<=n;i++){int l=i;for (int j=i+1;j<=n;j++)if (fabs(a[j][i])>fabs(a[l][i])) l=j;if (l!=i) for (int j=1;j<=n+1;j++) swap(a[i][j],a[l][j]);ld w=a[i][i];for (int j=1;j<=n+1;j++) a[i][j]/=w;for (int j=1;j<=n;j++){if (i==j) continue;ld w=a[j][i];for (int k=i;k<=n+1;k++) a[j][k]-=a[i][k]*w;}}
}int main()
{scanf("%d%d",&n,&m);for (int i=1;i<=n;i++) scanf("%s",s[i]+1);build();gauss(n+1);for (int i=1;i<=n;i++) printf("%.10lf\n",(double)a[i][n+2]);return 0;
}

bzoj 4820: [Sdoi2017]硬币游戏 概率dp+高斯消元+KMP相关推荐

  1. BZOJ 3270: 博物馆 1778: 驱逐猪猡 【概率DP+高斯消元】

    题目描述: 中文题面,不多解释.1778传送门 3270 传送门 (博物馆)题目分析: 也许很多人做概率题的时候都有种虚幻感..感觉莫名其妙就得出一个期望.概率,一知半解... 所以我在这里仔细地剖析 ...

  2. BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元

    BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元 题意: 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 3 ...

  3. 【bzoj1778】[Usaco2010 Hol]Dotp 驱逐猪猡 矩阵乘法+概率dp+高斯消元

    题目描述 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44,850)条由两 ...

  4. BZOJ3270 博物館 概率DP 高斯消元

    BZOJ3270 博物館 概率DP 高斯消元 @(XSY)[概率DP, 高斯消元] Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博 ...

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

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

  6. BZOJ 3270: 博物馆 [概率DP 高斯消元]

    http://www.lydsy.com/JudgeOnline/problem.php?id=3270 题意:一张无向图,一开始两人分别在$x$和$y$,每一分钟在点$i$不走的概率为$p[i]$, ...

  7. 【BZOJ3640】JC的小苹果 概率DP+高斯消元

    [BZOJ3640]JC的小苹果 Description 让我们继续JC和DZY的故事. "你是我的小丫小苹果,怎么爱你都不嫌多!" "点亮我生命的火,火火火火火!&qu ...

  8. [高斯消元 概率 KMP] BZOJ 4820 [Sdoi2017]硬币游戏

    一个直观的想法 是建AC自动机 然后消元 但是这样变量个数是O(nm)O(nm) 然后我就不会做了 概率题都好妙啊 一个精妙的设计是再定义一个状态N 表示当前串不包含任何人的概率 举个例子 来自这里 ...

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

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

最新文章

  1. mybatis mysql 配置文件_Mybatis配置文件详解(4)
  2. 【Linux】一步一步学Linux——free命令(80)
  3. sql重新注册服务器,sql server无法新建注册服务器怎么办?
  4. IOS UITouch 触摸事件,UIResponder 的作用
  5. transition实现隐藏显示菜单栏效果
  6. 学习MyBatis之简单入门HelloWorld
  7. PHP云和骑士人才优缺点,PHP云人才系统与骑士cms人才系统对比点评
  8. n986原生android,【极光ROM】-【三星NOTE20U(国行/港版/台版/韩版/美版) N986X-高通865P】-【V4.0 Android-R-UA3】...
  9. 启动Apache时提示缺少vcruntime140.dll怎么解
  10. 计算机网络常用知识总结!
  11. 为程序员更新了Joel测试
  12. Linux Python 导航目录
  13. Take Me To Your Heart by MLTR
  14. Apifox 学习笔记 - 前置操作
  15. 2021版!万字UNIX网络编程学习笔记(套接字篇)
  16. 2017lol服务器维修时间,lol年3月16日要维护多长时间2017_lol3.16维护时间公告_好特教程...
  17. 推荐5款体验较好的团队协作工具
  18. linux 软件 格式化u盘启动盘,使用syslinux制作U盘启动盘的方法
  19. CVPR 2020 Modality Shifting Attention Network for Multi-modal Video Question Answering
  20. 智能时代-大数据与智能革命重新定义未来(吴军)-核心书摘

热门文章

  1. python英寸和厘米的交互_python – 确定matplotlib轴大小(以像素为单位)
  2. tcgames使用有延迟_用tcgames安卓投屏到电脑键鼠玩《和平精英》怎么设置稳定90帧不延迟?...
  3. 搜遍全网,终于找到了报表自动化的最佳工具,比Excel好用10倍
  4. 果光的评测姬 原创题目
  5. 想学非标机械设计的朋友看过来!不然后悔终生!
  6. ThinkPHP5高校网络安全竞赛答题平台
  7. GBase 8s V8.8 SQL 指南:教程-6.4.1(1)
  8. 如何获得ESP32-WROOM-32技术规格书
  9. 计算机中ups的作用,UPS电源是什么?UPS电源有什么作用?
  10. 关于深澜校园网与Windows系统之间存在的bug及解决方法