做法太神了,理解不了。

自己想到的是建出AC自动机然后建出矩阵然后求逆计算,感觉可以过$40%$

用一个状态$N$表示任意一个位置没有匹配成功的概率和。

每种匹配不成功的情况都是等价的。

然后我们强制在后面加上长度为m的01串,那么这个串的概率是一定的。

然后考虑加上的这些字符还能拼成什么串,因为状态$N$的末尾是不确定的。

如果另外一个串的后缀等于这个串的前缀的话,是可能带来影响的。

所以计算出影响的概率,然后高斯消元即可。

然而有一个问题,N的概率最后消出来代表什么意思啊,是指期望的长度吗?

希望各位dalao不吝赐教。

#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define ll long long
#define mp make_pair int n,m,s[305][305],str[605],fail[605];
char ss[305];
double a[305][305],pw[305],ans[305]; void kmp()
{
// F(i,1,2*m) printf("%d ",str[i]); printf("\n");
str[0]=-1;
memset(fail,0,sizeof fail);
for (int i=2,j=0;i<=2*m;++i)
{
while (j&&str[i]!=str[j+1]) j=fail[j];
if (str[j+1]==str[i]) j++;
fail[i]=j;
}
// F(i,1,2*m) printf("%d ",fail[i]);printf("\n");
} void solve(int x)
{
a[x][x]=1;F(i,1,m) str[i]=s[x][i];
F(y,1,n)// if (y!=x)
{
F(i,1,m) str[i+m]=s[y][i]; kmp();
int now=fail[2*m];
// printf("now is %d\n",now);
while (now>=m) now=fail[now];
while (now)
{
// printf("Can %d\n",now);
a[x][y]+=pw[m-now];
now=fail[now];
}
}
a[x][n+1]=-pw[m]; a[x][n+2]=0;
} void Gauss()
{
F(i,1,n+1)
{
int tmp=i;
F(j,i+1,n+1) if (fabs(a[j][i])>fabs(a[i][i])) tmp=j;
if (tmp!=i) F(j,1,n+2) swap(a[i][j],a[tmp][j]);
F(j,1,n+1) if (j!=i)
{
double t=a[j][i]/a[i][i];
F(k,1,n+2) a[j][k]-=t*a[i][k];
}
// F(i,1,n+1){F(j,1,n+2)printf("%.3f ",a[i][j]);printf("\n");}
}
F(i,1,n+1) ans[i]=a[i][n+2]/a[i][i];
F(i,1,n) printf("%.10lf\n",ans[i]);
} int main()
{
// freopen("in.txt","r",stdin);
scanf("%d%d",&n,&m);
pw[0]=1;F(i,1,m)pw[i]=pw[i-1]*0.5;
F(i,1,n){scanf("%s",ss+1);F(j,1,m) s[i][j]=(ss[j]=='H');}
F(i,1,n) solve(i);
F(i,1,n) a[n+1][i]=1; a[n+1][n+2]=1;
// F(i,1,n+1){F(j,1,n+2)printf("%.3f ",a[i][j]);printf("\n");}
Gauss();
}

  

BZOJ 4820 [Sdoi2017]硬币游戏 ——期望DP 高斯消元的更多相关文章

  1. bzoj 4820: [Sdoi2017]硬币游戏【kmp+高斯消元】

    有点神,按照1444的做法肯定会挂 注意到它的概率是相同的,所以可以简化状态 详见http://www.cnblogs.com/candy99/p/6701221.html https://www.c ...

  2. bzoj 3143 [Hnoi2013]游走 期望dp+高斯消元

    [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3394  Solved: 1493[Submit][Status][Disc ...

  3. [BZOJ 4820] [SDOI2017] 硬币游戏(高斯消元+概率论+字符串hash)

    [BZOJ 4820] [SDOI2017] 硬币游戏(高斯消元+概率论+字符串hash) 题面 扔很多次硬币后,用H表示正面朝上,用T表示反面朝上,会得到一个硬币序列.比如HTT表示第一次正面朝上, ...

  4. BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元

    BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元 题意: 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机 ...

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

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

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

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

  7. BZOJ 3270 && BZOJ 1778 (期望DP && 高斯消元)

    BZOJ 3270 :设置状态为Id(x,y)表示一人在x,一人在y这个状态的概率. 所以总共有n^2种状态. p[i]表示留在该点的概率,Out[i]=(1-p[i])/Degree[i]表示离开该 ...

  8. BZOJ.2707.[SDOI2012]走迷宫(期望 Tarjan 高斯消元)

    题目链接 一个点到达终点的期望步数 \(E_i=\sum_{(i,j)\in G}\frac{E_j+1}{out[i]}\),\(out[i]\)为点\(i\)的出度. 那么对于一个DAG可以直接在 ...

  9. HDU 2262 Where is the canteen 期望dp+高斯消元

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2262 Where is the canteen Time Limit: 10000/5000 MS ...

随机推荐

  1. Unity3D中使用Projector生成阴影

    在Unity3D中使用Projector实现动态阴影 无意中看见一篇博客叙述使用Projector实现动态阴影可以在移动平台拥有非常好的性能,遂按照其想法实现了一遍,发现其中竟有许多细节,写下这篇博客 ...

  2. EditPlus 3.7激活码注册码

    EditPlus3.7激活教程以及EditPlus3.7激活码使用方法 EditPlus是一款功能齐全的文字编辑器,搭配其他的插件还可以实现很多的功能,还可以编辑和编译Java,调试程序等,主要用来打 ...

  3. 2018.3.31 java中的递归

    java中的递归 1.概念 定义一个方法时,出现本方法调用本方法的过程,称之为递归 2.特点 必然有一个边界条件 使用递归代码往往更简洁,可读性强 3.什么时候使用递归 n的阶乘和n的累加定义 f(n ...

  4. Java的引用StrongReference、 SoftReference、 WeakReference 、PhantomReference

    1. Strong Reference StrongReference 是 Java 的默认引用实现,  它会尽可能长时间的存活于 JVM 内, 当没有任何对象指向它时 GC 执行后将会被回收 @Te ...

  5. C++类和结构体的区别

    C++类和结构体的区别? 结构体默认数据访问控制是public; 类默认数据访问控制是private;

  6. 安装IAR ewarm

    一  安装准备 (ST方案) 1 嵌入式集成开发环境IAR ewarm 5.41 2 J-Link4.20 3 emberznet-4.3.0协议栈安装包 option1:tools - stm32软 ...

  7. java--String、StringBuilder、StringBuffer的解析和比较?

    一.String的解析 1.String的含义 ①String是不可以被继承的,String类是final类,String类是由char[]数组来存储字符串. ②String是不可变的字符序列,如果存 ...

  8. python入门:输出1-10的所有数(自写)

    #!/usr/bin/env python # -*- coding:utf-8 -*- #输出1-10的所有数(自写) """ 导入time库,给kaishi赋值为数字 ...

  9. Python——format汇总

    一.str.format 按照指定格式格式化字符串,然后返回格式化的字符串,源字符串不变. 以下是Python2.7环境. 1.1.按照位置替换 参考下面例子: >>> s = '{ ...

  10. java中类与对象的概念(2013-05-04-bd 写的日志迁移

    1:类是抽象的,概念的,代表一类事物,比如人类.猫类.. 2:对象是具体的,实际的,代表一个具体的事物 3:类是对象的模板,对象是类的一个个体,实例 创建对象的两种方法: 1.先声明在创建 对象声明: ...