BZOJ4820 Sdoi2017 硬币游戏


Description

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

Input

第一行两个整数n,m。
接下里n行,每行一个长度为m的字符串,表示第i个同学猜的序列。
1<=n,m<=300

Output

输出n行,第i行表示第i个同学胜利的概率。
输出与标准输出的绝对误差不超过10^-6即视为正确。

Sample Input

3 3
THT
TTH
HTT

Sample Output

0.3333333333
0.2500000000
0.4166666667



#include<bits/stdc++.h>
using namespace std;
#define N 310
#define eps 1e-3
#define For(a,b,c) for(int a=b;a<=c;a++)
int n,m;
double g[N][N];
void guass(){
For(i,1,n){
int p=i;
For(j,i,n)if(abs(g[j][i])>abs(g[p][i]))p=j;
For(j,1,n+1)swap(g[p][j],g[i][j]);
double d=g[i][i];
For(j,1,n+1)g[i][j]/=d;
For(j,1,n){
if(i==j)continue;
double w=g[j][i];
For(k,1,n+1)g[j][k]-=g[i][k]*w;
}
}
For(i,1,n-1)printf("%.10lf\n",g[i][n+1]);
}
int fail[N][N];
int s[N][N];
double p[N];
void init(int id){
For(i,2,m){
int j=fail[id][i-1];
while(j&&s[id][i]!=s[id][j+1])j=fail[id][j];
if(s[id][i]==s[id][j+1])fail[id][i]=j+1;
else fail[id][i]=0;
}
}
double kmp(int ida,int idb){
int j=0;
For(i,1,m){
while(j&&s[idb][i]!=s[ida][j+1])j=fail[ida][j];
if(s[idb][i]==s[ida][j+1])++j;
}
double res=0;
while(j){
res+=p[m-j];
j=fail[ida][j];
}
return res;
}
int main(){
scanf("%d%d",&n,&m);
p[0]=1;For(i,1,m)p[i]=p[i-1]*0.5;
For(i,1,n){
static char c[N];
scanf("%s",c+1);
For(j,1,m)
if(c[j]=='H')s[i][j]=1;
else s[i][j]=0;
init(i);
}
For(i,1,n)For(j,1,n)g[i][j]=kmp(i,j);
For(i,1,n)g[i][n+1]=-p[m];
For(i,1,n)g[n+1][i]=1;
g[n+1][n+2]=1;
n++;
guass();
return 0;
}

BZOJ4820 Sdoi2017 硬币游戏 【概率期望】【高斯消元】【KMP】*的更多相关文章

  1. BZOJ4820 SDOI2017硬币游戏(概率期望+高斯消元+kmp)

    容易想到的做法是建出AC自动机,高斯消元.然而自动机上节点数量是nm的. 注意到我们要求的变量只有n个,考虑将其他不用求的节点合并为一个变量.这个变量即表示随机生成一个串,其不包含任何一个模板串的概率 ...

  2. luoguP4457 [BJOI2018]治疗之雨 概率期望 + 高斯消元

    应该是最后一道紫色的概率了....然而颜色啥也代表不了.... 首先看懂题意: 你现在有$p$点体力,你的体力上限为$n$ 在一轮中, 1.如果你的体力没有满,你有$\frac{1}{m + 1}$的 ...

  3. BZOJ.3143.[HNOI2013]游走(概率 期望 高斯消元)

    题目链接 参考 远航之曲 把走每条边的概率乘上分配的标号就是它的期望,所以我们肯定是把大的编号分配给走的概率最低的边. 我们只要计算出经过所有点的概率,就可以得出经过一条边(\(u->v\))的 ...

  4. [HNOI2011]XOR和路径 概率期望 高斯消元

    题面 题解:因为异或不太好处理,,,因此按位来算,这样最后的答案就是每一位上的值乘对应的权值再求和.本着期望要倒退的原则,,,我们设$f[i]$表示从$i$到$n$,xor和为1的概率.那么观察$xo ...

  5. [HNOI2013] 游走 - 概率期望,高斯消元,贪心

    假如我们知道了每条边经过的期望次数,则变成了一个显然的贪心.现在考虑如何求期望次数. 由于走到每个点后各向等概率,很显然一条边的期望次数可以与它的两个端点的期望次数,转化为求点的期望次数 考虑每个点对 ...

  6. 4.23 子串 AC自动机 概率期望 高斯消元

    考虑40分. 设出状态 f[i]表示匹配到了i位还有多少期望长度能停止.可以发现这个状态有环 需要高斯消元. 提供一种比较简单的方法:由于期望的线性可加性 可以设状态f[i]表示由匹配到i到匹配到i+ ...

  7. UVA-10828 (概率期望+高斯消元)

    题意: 给个有向图,每个节点等概率转移到它的后继节点,现在问一些节点的期望访问次数; 思路: 对于一个点v,Ev=Ea/d[a]+Eb/d[b]+Ec/d[c];a,b,c是v的前驱节点; 然后按这个 ...

  8. luoguP3232 [HNOI2013]游走 贪心 + 概率期望 + 高斯消元

    首先,题目中的无向简单连通图代表着没有自环,重边... 总分的期望 = 每条边的期望之和...................每条边的期望又可以拆成$u \to v$的期望和$v \to u$的期望 ...

  9. 【BZOJ】3143: [Hnoi2013]游走 期望+高斯消元

    [题意]给定n个点m条边的无向连通图,每条路径的代价是其编号大小,每个点等概率往周围走,要求给所有边编号,使得从1到n的期望总分最小(求该总分).n<=500. [算法]期望+高斯消元 [题解] ...

随机推荐

  1. ArrayBuffer

    ArrayBuffer对象.TypedArray视图和DataView视图是 JavaScript 操作二进制数据的一个接口.这些对象早就存在,属于独立的规格(2011 年 2 月发布),ES6 将它 ...

  2. python+opencv链接摄像头

    import cv2 import numpy as numpy cap=cv2.VideoCapture(0) #设置显示分辨率和FPS ,不设置的话会非常卡 cap.set(cv2.CAP_PRO ...

  3. Android和iOS中Cocos2dx的横屏竖屏设置

    一.横屏.竖屏设置 1.android AndroidManifest.xml文件中, screenOrientation="landscape" 为横屏, screenOrien ...

  4. 键盘对应数字-keycode值大全(转)

    event.keycode值大全   keycode 8 = BackSpace BackSpace    keycode 9 = Tab Tab    keycode 12 = Clear    k ...

  5. SpringMVC之ModelAndView的 jsp值在浏览页面不显示

    Tomcat运行后浏览器上显示的结果! <%@ page isELIgnored="false" %>改变后问spring mvc开发过程中, 经常会给model ad ...

  6. HDU-4714-贪心

    Tree2cycle Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)Tot ...

  7. tkinter模块常用参数

    tkinter模块常用参数   1.使用tkinter.Tk() 生成主窗口(root=tkinter.Tk()):root.title('标题名')    修改框体的名字,也可在创建时使用class ...

  8. 3.spring cloud eureka 高可用

    1.目的 防止某一台服务器宕机 通常通过多台EUREKA来为客户端进行注册,客户也进行注册 2.开启三台EUREKA 三天EUREKA分别对应端口 8761 8762 8763 配置文件如下 EURE ...

  9. 009PHP基础知识——运算符(二) 逻辑运算符

    <?php /**运算符(二) 逻辑运算符: */ //1.逻辑与 and或&& 左右两边表达式均成立TRUE ,返回真值: /*$uname='admin'; $upwd='l ...

  10. Prism 4 文档 ---第3章 管理组件间的依赖关系

     基于Prism类库的应用程序可能是由多个松耦合的类型和服务组成的复杂应用程序,他们需要根据用户的动作发出内容和接收通知进行互动,由于他们是松耦合的,他们需要一种方式来互动和交流来传递业务功能的需求. ...