正题

题目链接:https://www.luogu.com.cn/problem/P3706


题目大意

给出 nnn 个长度为 mmm 的 H/TH/TH/T 串。

开始一个空序列,每次随机在后面加一个 H/TH/TH/T ,求每个串第一次出现的概率。

1≤n,m≤3001\leq n,m\leq 3001≤n,m≤300


解题思路

数据范围显然不能在AC自动机上高斯消元,所以得考虑别的方法。

考虑一个很妙的做法,设一个状态NNN表示目前还没有匹配完成的串,然后考虑串A=HHTA=HHTA=HHT和串B=THHB=THHB=THH,那么在NNN后面直接插入一个AAA的概率就是p(N+A)=p(N)×2−mp(N+A)=p(N)\times 2^{-m}p(N+A)=p(N)×2−m

但是考虑到有可能NNN先拼出了BBB然后再拼出AAA,此时考虑BBB的后缀对应AAA前缀的有H,HHH,HHH,HH。那么就有
p(N)×2−m=p(N+A)=p(A)+p(B)×2−2+p(B)×2−1p(N)\times 2^{-m}=p(N+A)=p(A)+p(B)\times 2^{-2}+p(B)\times 2^{-1}p(N)×2−m=p(N+A)=p(A)+p(B)×2−2+p(B)×2−1

这样不难发现对于别的串如果它的一些后缀是这个串的前缀那么就会产生一些概率,用字符串hashhashhash匹配即可。

然后会发现还是少了一个方程,最后一个就是所有串的概率和为111就好了。

这样就有n+1n+1n+1个方程了。

时间复杂度:O(n2m+n3)O(n^2m+n^3)O(n2m+n3)


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】相关推荐

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

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

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

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

  3. P3706 [SDOI2017]硬币游戏

    P3706 [SDOI2017]硬币游戏 题目描述 Solution 前置技能: P4548 [CTSC2006]歌唱王国 歌唱王国就是n=1n=1n=1的情况. 我们用类似的方法,先考虑两个串的情况 ...

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

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

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

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

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

    [BZOJ4820][SDOI2017]硬币游戏(高斯消元) 题面 BZOJ 洛谷 题解 第一眼的感觉就是构\(AC\)自动机之后直接高斯消元算概率,这样子似乎就是\(BZOJ1444\)了.然而点数 ...

  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. 第十四周项目一-排序函数模版
  2. iOS开发之加载大量网络图片优化
  3. 更改应用程序图标_【iOS12人机交互指南】6.2-应用图标
  4. html图片按页码显示,html - 在打印html文档时显示页码 - 堆栈内存溢出
  5. js粘贴板为什么获取不到图片信息_图床+typora,告别markdown中关于图片的困惑
  6. Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine
  7. python批量读取文件赋值给一个参数_求助一个Python 循环读取文件,并对读到的字符串进行赋值,然后进一步生成json file 的方法。...
  8. r语言html帮助是什么东西,R语言帮助的使用
  9. vue3安装WangEditor富文本编辑器v5版本
  10. PINN物理驱动的深度学习方法入门到详解
  11. VC++ 屏幕捕获(DXGI)
  12. Java总结IO篇之字符流
  13. java中Scanner,Randon,ArrayList
  14. Java语言-27:Map接口
  15. Revit二次开发从入门到精通学习之路, (含Revit二次开发教程下载)
  16. 163vip邮箱手机快速注册,163手机邮箱如何登录?
  17. 「ZBrush」学习ZB出来可以从事什么工作?小白都知道吗?
  18. 最佳线程数和QPS以及RT
  19. tcpip四层源码分析(Linux)
  20. BZOJ 5010: [Fjoi2017]矩阵填数

热门文章

  1. 父类可以调用子类的方法吗_python类的继承、多继承及查找方法顺序
  2. c#web服务器 虚拟目录,C#建立自己的Web服务器
  3. php 筛选数组,2020-07-24 php 通过数组键值对筛选数组
  4. 创建失败_号称人人都可编辑的百科词条,创建之路为何屡屡失败?
  5. 专升本c语言网课听谁的好_都说塑钢泥比玻璃胶好,填缝永不变黑,师傅却说不好用,听谁的?...
  6. 华科计算机课程设计,华中科大操作系统课程设计报告(附源码).doc
  7. Linux查看设备 eth,lspci grep Eth,查看Linux下的各种硬件设备是否识别或存在之用
  8. mysql外键约束创建及删除_MySQL中的外键的创建,约束和删除
  9. div css标记,前端初学者必学的div加css标签
  10. leetcode54. 螺旋矩阵(详解)