BZOJ4820 SDOI2017硬币游戏(概率期望+高斯消元+kmp)
容易想到的做法是建出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)的更多相关文章
- luoguP4457 [BJOI2018]治疗之雨 概率期望 + 高斯消元
应该是最后一道紫色的概率了....然而颜色啥也代表不了.... 首先看懂题意: 你现在有$p$点体力,你的体力上限为$n$ 在一轮中, 1.如果你的体力没有满,你有$\frac{1}{m + 1}$的 ...
- BZOJ.3143.[HNOI2013]游走(概率 期望 高斯消元)
题目链接 参考 远航之曲 把走每条边的概率乘上分配的标号就是它的期望,所以我们肯定是把大的编号分配给走的概率最低的边. 我们只要计算出经过所有点的概率,就可以得出经过一条边(\(u->v\))的 ...
- [HNOI2011]XOR和路径 概率期望 高斯消元
题面 题解:因为异或不太好处理,,,因此按位来算,这样最后的答案就是每一位上的值乘对应的权值再求和.本着期望要倒退的原则,,,我们设$f[i]$表示从$i$到$n$,xor和为1的概率.那么观察$xo ...
- [HNOI2013] 游走 - 概率期望,高斯消元,贪心
假如我们知道了每条边经过的期望次数,则变成了一个显然的贪心.现在考虑如何求期望次数. 由于走到每个点后各向等概率,很显然一条边的期望次数可以与它的两个端点的期望次数,转化为求点的期望次数 考虑每个点对 ...
- 4.23 子串 AC自动机 概率期望 高斯消元
考虑40分. 设出状态 f[i]表示匹配到了i位还有多少期望长度能停止.可以发现这个状态有环 需要高斯消元. 提供一种比较简单的方法:由于期望的线性可加性 可以设状态f[i]表示由匹配到i到匹配到i+ ...
- UVA-10828 (概率期望+高斯消元)
题意: 给个有向图,每个节点等概率转移到它的后继节点,现在问一些节点的期望访问次数; 思路: 对于一个点v,Ev=Ea/d[a]+Eb/d[b]+Ec/d[c];a,b,c是v的前驱节点; 然后按这个 ...
- luoguP3232 [HNOI2013]游走 贪心 + 概率期望 + 高斯消元
首先,题目中的无向简单连通图代表着没有自环,重边... 总分的期望 = 每条边的期望之和...................每条边的期望又可以拆成$u \to v$的期望和$v \to u$的期望 ...
- BZOJ4820 Sdoi2017 硬币游戏 【概率期望】【高斯消元】【KMP】*
BZOJ4820 Sdoi2017 硬币游戏 Description 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利.大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬币实 ...
- 【BZOJ】3143: [Hnoi2013]游走 期望+高斯消元
[题意]给定n个点m条边的无向连通图,每条路径的代价是其编号大小,每个点等概率往周围走,要求给所有边编号,使得从1到n的期望总分最小(求该总分).n<=500. [算法]期望+高斯消元 [题解] ...
随机推荐
- 北京Uber优步司机奖励政策(12月11日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- COGS:1822. [AHOI2013]作业
1822. [AHOI 2013] 作业 ★★★ 输入文件:ahoi2013_homework.in 输出文件:ahoi2013_homework.out 简单对比时间限制:20 s ...
- 使用vs code写php及调试
原文来自:http://www.cnblogs.com/CLR010/p/5276077.html 首页先改下php.ini 一般是在最底部,有就修改没有就加上去下面的配置: xdebug.remot ...
- JavaWeb(二)——Tomcat服务器(一)
一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml ...
- 使用gitlab时候 fork仓库不会实时从主仓库更新解决方案
付费用户可以使用现成的方案,地址见 链接 但是私有gitlab时候,需要手动进行如下操作 1. Clone your fork: git clone git@github.com:YOUR-USERN ...
- Shader Forge学习
最近学习了一下shader forge,一个屌屌哒插件用来生成shader.尽管其降低了制作shader的难度,但是真的想做出满意的shader的话还是得有一定的shader基础.但是仅仅是做出一些简 ...
- Unity与服务区交互数据
Unity与服务区交互数据 Unity可能在用的时候使用到登陆等需要与服务器交互数据.今天尝试使用了WWW类和WWWForm类来实现Get请求与Post请求. 1.WWW Unity圣典解释: WWW ...
- vs_code 快捷键
一般的Ctrl+Shift+P,F1显示命令面板按Ctrl+P快速打开,到文件.Ctrl + Shift + N新窗口/实例Ctrl + Shift + W /关闭窗口实例Ctrl +.用户设置Ctr ...
- 第一周 Welcome
什么是机器学习 您也许一天用它几十次都不知道,每次你用google或者bing搜索网页感觉很厉害,因为他们用机器学习软件来设计网页排名,当你用Facebook或Apple的照片软件而它们知道照片里面哪 ...
- MongoDB3.2 集群搭建
一.集群的理论知识 1.1 集群成员 MongoDB的集群类似于GreenPlum集群,由一个入口节点负责任务分发与结果统计,分片结节负责执行任务.不同GP,多了一个config servers. 集 ...