[Sdoi2017]硬币游戏

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


考场用了[1444: Jsoi200]有趣的游戏的做法,40分

标解好神!

思想就是用N表示所有没有人获胜的状态,然后列方程

对于A,B两个串

例如:

A=TTH, B=HTT

那么N+TTH一定会到终止点,但不一定TTH加完后才停止

NTTH = A + BH + BTH

0.125N = A + 0.75B

获胜概率和为1

n+1个变量 n+1个方程 高斯消元

怎么解释呢?

就是把一些状态的概率用一些变量表示出来了呀

计算系数可以两两用kmp,求B再方程A中的系数:AB连起来求fail,然后得到后缀=前缀了

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=305;
const double eps=1e-10;
inline int read() {
char c=getchar(); int x=0, f=1;
while(c<'0' || c>'9') {if(c=='-')f=-1; c=getchar();}
while(c>='0' && c<='9') {x=x*10+c-'0'; c=getchar();}
return x*f;
} int n, m;
char s[N][N];
double a[N][N], two[N];
namespace kmp {
char s[N<<1];
int fail[N];
void build(char *s, int n) {
fail[1] = 0;
for(int i=2; i<=n; i++) {
int now = fail[i-1];
while(now && s[i] != s[now+1]) now = fail[now];
fail[i] = s[i]==s[now+1] ? now+1 : 0;
}
}
double cal(char *a, char *b) {
int n = m<<1;
for(int i=1; i<=m; i++) s[i] = a[i];
for(int i=1; i<=m; i++) s[i+m] = b[i];
build(s, n);
//for(int i=1; i<=n; i++) printf("%d ", fail[i]); puts("");
int now = fail[n]; double ans = 0;
while(now) ans += two[m-now], now = fail[now];
//printf("ans %lf\n", ans);
return ans;
}
} void build() {
two[0]=1;
for(int i=1; i<=m; i++) two[i] = two[i-1] * 0.5; for(int i=1; i<=n; i++) a[n+1][i] = 1;
a[n+1][n+2] = 1;
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) a[i][j] = kmp::cal(s[i], s[j]);
a[i][n+1] = -two[m];
}
} void gauss(int n) {
//for(int i=1; i<=n; i++) for(int j=1; j<=n+1; j++) printf("%lf%c", a[i][j], j==n+1 ? '\n' : ' ');
for(int i=1; i<=n; i++) {
int r=i;
for(int k=i; k<=n; k++) if(abs(a[k][i]) > abs(a[r][i])) r=k;
if(r != i) for(int j=i; j<=n+1; j++) swap(a[r][j], a[i][j]); for(int k=i+1; k<=n; k++) {
double t = a[k][i] / a[i][i];
for(int j=i; j<=n+1; j++) a[k][j] -= t * a[i][j];
}
}
for(int i=n; i>=1; i--) {
for(int j=n; j>i; j--) a[i][n+1] -= a[i][j] * a[j][n+1];
a[i][n+1] /= a[i][i];
}
}
int main() {
freopen("game.in", "r", stdin);
freopen("game.out", "w", stdout);
n=read(); m=read();
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", a[i][n+2]);
}

[Sdoi2017]硬币游戏 [高斯消元 KMP]的更多相关文章

  1. [BZOJ4820][SDOI2017]硬币游戏(高斯消元+KMP)

    比较神的一道题,正解比较难以理解. 首先不难得出一个(nm)^3的算法,对所有串建AC自动机,将在每个点停止的概率作为未知数做高斯消元即可. 可以证明,AC自动机上所有不是模式串终止节点的点可以看成一 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. android新闻App源码、仿微信源码、地图音乐源码等

    Android精选源码 一款实用的休闲类App,新闻视频和技术应有尽有. android实现交互式K线图表源码 android新闻客户端和服务器源码 android MatetialDesign设计 ...

  2. Windows系统下文件的概念及c语言对其的基本操作(乙)

  3. springboot注解使用说明

    springboot注解 @RestController和@RequestMapping注解 我们的Example类上使用的第一个注解是 @RestController .这被称为一个构造型(ster ...

  4. 免费V P N获取方式

    给需要加速器链接国外网站的朋友, 打开网址:http://miaoaff.com/reg.php?id=204250: 用一个邮箱注册,就会得到一个免费的vpn软件账号(包含300M流量时间永久): ...

  5. Linux包管理器

    按Linux系统分类 Redhat系列:Redhat(本身就是Centos).Centos.Fedora等,采用Dpkg包管理器 Debian系列:Debian.Ubuntu等,使用RPM包管理器 R ...

  6. HTTP的请求方法OPTIONS

    HTTP请求方法并不是只有GET和POST,只是最常用的.据RFC2616标准(现行的HTTP/1.1)得知,通常有以下8种方法:OPTIONS.GET.HEAD.POST.PUT.DELETE.TR ...

  7. dedecms列表页有图调用缩略图无图留空的方法

    默认情况下,织梦的文章列表页会调用出当前栏目下的文章列表,并且调用出每个文章的缩略图:如果文章本身就有图,会调用出一张小图,如果没有,则会显示默认的织梦图片.这种处理方式有时候比较影响美观,其实可以修 ...

  8. js立体旋转展示效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. php 邓士鹏

    // $is_company = $_groupid > 5 || ($_groupid == 4 && $user['regid'] > 5); $_E = ($MOD[ ...

  10. Web前端学习(1):上网的过程与网页的本质

    "众里寻他千百度"--但是在信息化时代,我们只需要动动手指百度一下,google一下,便可以在网络上寻得我们想要查找的信息.我们或许都知道要如何在网上获得自己所需信息,但是上网的过 ...