容易想到的做法是建出AC自动机,高斯消元。然而自动机上节点数量是nm的。

  注意到我们要求的变量只有n个,考虑将其他不用求的节点合并为一个变量。这个变量即表示随机生成一个串,其不包含任何一个模板串的概率。

  现在即有n+1个变量,考虑列出n+1个方程。设pi表示第i个人胜利的概率,显然有Σpi=1。然后对每个pi列一个方程,即考虑其胜利概率。在无胜利者的随机串后面接上这个串,这样这个人有可能成为胜利者,但也有可能之前的随机串加上这个串的一段前缀后已经包含了另一个串(可能是其自身),需要减掉这一部分。注意所有长度相同的串的出现概率都是均等的。设之前生成的随机串为S,当前考虑的串为si,加上si时在si之前出现的串为sj,那么这种情况出现的概率即为Σpj*0.5m-len,其中len为sj的后缀和si的前缀的任一匹配长度。因为S去掉某段后缀后得到的S'仍是不包含模板串的串,那么出现S'+sj的概率恰好为pj,而后面一部分则为恰好与si匹配上的概率。匹配长度显然可以用kmp算。

  (感觉没一句话说清楚了

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 310
#define double long double
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,m,s[N][N],nxt[N][N];
double a[N][N];
void gauss()
{
for (int i=;i<=n;i++)
{
int mx=i;
for (int j=i+;j<=n;j++) if (fabs(a[j][i])>fabs(a[mx][i])) mx=j;
if (mx!=i) swap(a[i],a[mx]);
for (int j=;j<=n;j++)
if (i!=j)
{
double t=a[j][i]/a[i][i];
for (int k=;k<=n+;k++)
a[j][k]-=a[i][k]*t;
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj4820.in","r",stdin);
freopen("bzoj4820.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read(),m=read();
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
s[i][j]=getc()=='T';
for (int i=;i<=n;i++)
{
nxt[i][]=-;
for (int j=;j<=m;j++)
{
int k=nxt[i][j-];
while (~k&&s[i][k+]!=s[i][j]) k=nxt[i][k];
nxt[i][j]=k+;
}
}
for (int i=;i<=n;i++)
{
a[i][i]=-;a[i][n+]=pow(0.5,m);
for (int j=;j<=n;j++)
{
int x=;
for (int k=;k<=m;k++)
{
while (~x&&s[j][k]!=s[i][x+]) x=nxt[i][x];
x++;
}
if (x==m) x=nxt[i][x];
while (x) a[i][j]-=pow(0.5,m-x),x=nxt[i][x];
}
}
for (int i=;i<=n;i++) a[n+][i]=;a[n+][n+]=;
n++;
gauss();
#undef double
for (int i=;i<n;i++)
{
double x=a[i][n+]/a[i][i];
printf("%.10lf\n",x);
}
return ;
}

BZOJ4820 SDOI2017硬币游戏(概率期望+高斯消元+kmp)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. java 中的线程池和线程 调用小demo

    public class Main { public static void main(String[] args) { try { /// ThreadPoolExecutor executor = ...

  2. leetcode--笔记8 Fizz Buzz

    题目要求: Write a program that outputs the string representation of numbers from 1 to n. But for multipl ...

  3. JS中String对象常用的方法

    1.  stringObject.charAt(index) 参数:index 必需,即字符在字符串中的下标.  返回值:   返回在指定位置的字符.返回的字符是长度为 1的字符串.(length属性 ...

  4. java对象创建过程简介

    这是看书的记录,字有点丑啊还是将就搬上来 -.-,等把后面看了完善图

  5. 怎样安装Appium

    在浏览器地址栏输入 http://appium.io/ 打开Appium官网: 安装包下载完成后, 一路默认安装, 什么都不用点击, 等待大约10分钟: 安装完成后, 会在桌面生成快捷图标: 启动: ...

  6. pyhon文件操作典型代码实现(非常经典!)

    1. 编写一个程序,统计当前目录下每个文件类型的文件数,程序实现如图: 实现代码: import os all_files = os.listdir(os.chdir("D:\\" ...

  7. 初学Direct X(9) ——文字的显示

    初学Direct X(9) --文字的显示 本次学习如何使用ID3DXFont创建字体,使得我们可以在任何安装了Windows系统中TrueType字体来打印文字,不过最好使用标准字体,这样文字在每一 ...

  8. Solr与Elasticsearch区别

    Elasticsearch Elasticsearch是一个实时的分布式搜索和分析引擎.它可以帮助你用前所未有的速度去处理大规模数据. 它可以用于全文搜索,结构化搜索以及分析. 优点 Elastics ...

  9. java核心技术 笔记

    一 . 总览 1. 类加载机制:jdk内嵌的class_loader有哪些,类加载过程.--后面需要补充 2. 垃圾收集基本原理,常见的垃圾收集器,各自适用的场景.--后面需要补充 3. 运行时动态编 ...

  10. C复合文字

    C99之前,可以传递数组,但是没有所谓的数组常量可供传递,于是新增了复合文字. 普通数组声明方法: int d[2]={10,20}; 复合文字声明: 与数组名相同,常量同时代表元素的地址. (int ...