比较神的一道题,正解比较难以理解。

首先不难得出一个(nm)^3的算法,对所有串建AC自动机,将在每个点停止的概率作为未知数做高斯消元即可。

可以证明,AC自动机上所有不是模式串终止节点的点可以看成一个点,不妨合并为同一个点(n+1号点)。

对于一个模式串,它肯定是从n+1号点走了m步后到达的,概率为0.5^m。但是有可能还没走到m步的时候就已经匹配上另一个串了(可能是它本身),那么这另一个串的后缀一定是这个串的前缀。枚举这种串的位置,将它的概率贡献减去。

这样就是单模式串匹配问题了,可以用KMP解决。现在已经有n个方程了,再加上p[1]+p[2]+...+p[n+1]=1一共n+1个方程,高斯消元解出p[1],...,p[n+1]这n+1个未知数即可。

 #include<cmath>
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
using namespace std; const int N=;
int n,m,s[N][N],nxt[N][N];
double a[N][N]; void Gauss(int n){
rep(i,,n){
int k=i;
rep(j,i+,n) if (fabs(a[j][i])>fabs(a[k][i])) k=j;
swap(a[i],a[k]);
rep(j,,n) if (i!=j){
double t=a[j][i]/a[i][i];
rep(k,,n+) a[j][k]-=t*a[i][k];
}
}
} int main(){
freopen("bzoj4820.in","r",stdin);
freopen("bzoj4820.out","w",stdout);
scanf("%d%d",&n,&m); char ch;
rep(i,,n) rep(j,,m) scanf(" %c",&ch),s[i][j]=(ch=='T');
rep(i,,n){
nxt[i][]=nxt[i][]=; int p=;
rep(j,,m){
while (p && s[i][p+]!=s[i][j]) p=nxt[i][p];
if (s[i][p+]==s[i][j]) nxt[i][j]=++p; else nxt[i][j]=;
}
}
rep(i,,n){
a[i][i]=-; a[i][n+]=pow(0.5,m);
rep(j,,n){
int p=;
rep(k,,m){
while (p && s[i][p+]!=s[j][k]) p=nxt[i][p];
if (s[i][p+]==s[j][k]) p++;
}
if (p==m) p=nxt[i][p];
while (p) a[i][j]-=pow(0.5,m-p),p=nxt[i][p];
}
}
rep(i,,n) a[n+][i]=; a[n+][n+]=; Gauss(n+);
rep(i,,n) printf("%.10lf\n",a[i][n+]/a[i][i]);
return ;
}

[BZOJ4820][SDOI2017]硬币游戏(高斯消元+KMP)的更多相关文章

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

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

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

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

  3. BZOJ4820 Sdoi2017 硬币游戏 【概率期望】【高斯消元】【KMP】*

    BZOJ4820 Sdoi2017 硬币游戏 Description 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利.大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬币实 ...

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

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

  5. [bzoj4820][Sdoi2017]硬币游戏

    来自FallDream的博客,未经允许,请勿转载,谢谢. 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利.大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬币实在是太单调了 ...

  6. 【bzoj3105】[cqoi2013]新Nim游戏 高斯消元求线性基

    题目描述 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴.可以只拿一根,也可以拿走整堆火柴,但不能同时从 ...

  7. BZOJ 3105: [cqoi2013]新Nim游戏 [高斯消元XOR 线性基]

    以后我也要用传送门! 题意:一些数,选择一个权值最大的异或和不为0的集合 终于有点明白线性基是什么了...等会再整理 求一个权值最大的线性无关子集 线性无关子集满足拟阵的性质,贪心选择权值最大的,用高 ...

  8. UVA 1358 - Generator(dp+高斯消元+KMP)

    UVA 1358 - Generator option=com_onlinejudge&Itemid=8&page=show_problem&category=524& ...

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

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

随机推荐

  1. python 面试题4

    Python面试题 基础篇 分类: Python2014-08-08 13:15 2071人阅读 评论(0) 收藏 举报 最近,整理了一些python常见的面试题目,语言是一种工具,但是多角度的了解工 ...

  2. Servlet笔记5--设置欢迎页面及HTTP状态码404、500

    欢迎页面: 代码详解: web.xml配置文件: <?xml version="1.0" encoding="UTF-8"?> <web-ap ...

  3. SELinux 入门【转】

    一.前言 安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统.SELinux 主要由美国国 ...

  4. eclipse安装阿里代码扫描插件

    1.首先打开eclipse软件,点击工具栏上的Help,选择Install New Soft进行安装新的插件. 2.进入插件安装界面,点击Add,弹出插件地址填写界面,也可以直接在市场上搜索关键字al ...

  5. jquery记忆笔记

    1.javascript需要注意的一些问题: ①不要使用==比较,始终坚持使用===比较. false == 0; // true false === 0; // false ②NaN这个特殊的Num ...

  6. 正则表达式基础->

    描述:(grep) 正则表达式是一种字符模式,用于在查找过程中匹配指定的字符.在大多数程序里,正则表达式都被置于两个正斜杠之间,它匹配被查找的行中任何位置出现的相同模式 基础正则表达式 正则表达式 描 ...

  7. 常见四大类型视频接线DP、HDMI、DVI、VGA的比较

    如今是新的“视”界,生活中总与各种屏幕打交道,难免会遇到选择视频接线的问题,要想搞清楚这点,我们只要通过了解现今常用的几种视频接线就会有个大致的认识.   281VGA.DVI.HDMI三种视频信号接 ...

  8. JVM性能调优监控工具——jps、jstack、jmap、jhat、jstat、hprof使用详解

    摘要: JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps.jstack.jmap.jhat.jstat.hprof等小巧的工具,本博客希望 ...

  9. Git 撤销操作、删除文件和恢复文件

    大致介绍 经过前面的学习,已经建立了版本库,并上传了文件,这次来学习对这些文件进行基本的操作,即: ◆ 撤销操作 ◆ 删除文件 ◆ 恢复文件 我在此之前,已经将三个文件提交到了版本库 撤销操作 撤销操 ...

  10. Github中展示demo

    原文链接http://www.jianshu.com/p/75e30889e70a 第一步:找到Settings,点击 第二步:找到githubPages点击none,切换到master branch ...