题面链接

洛咕

sol

神题,幸好我不是SD的QAQ。

假设你们都会\(O(n^3m^3)\)的高斯消元,具体来说就是建出\(Trie\)图然后套游走的板子。

然后我们发现可以把不能匹配任何串的概率压到一起。

考虑一个不能匹配任何串的\(S\)。一个串\(A_i\)获胜当且仅当最后串是这样的:\(S+A_i\)。

真的吗?

如果\(S\)的后缀和\(A_i\)的前缀能拼出来\(A_j\)就假掉了。所以神仙们采用了神仙做法。

引用\(Kelin\)神犇的例子。

举个例子设\(A=101,B=110\)。

\(S101=(S+A),(S'+A+01),(S''+B+1)\),其中\(S'+10=S,S''+1=S\)。

上面三种组成方式概率为\(2\)的他们后面串的长度次方,分别是\(1,\frac{1}{4},\frac{1}{2}\)。

于是一个上好的方程就列出来了。

\[\frac{1}{8}P_S=(1+\frac{1}{4})P_A+\frac{1}{2}P_B$$。

由于~~这种辣鸡题目你直接消肯定是错的的定律~~这些方程一定有$n$个可以线性张成另一个,所以我们还要加上$\sum\limits_{i=1}^nP_i=1$。

毕竟我们什么都不加的化每个$P_i$扩大相同倍数也是对的QAQ。

就酱。

```
#include<cstdio>
#include<cstring>
#include<algorithm>
#define gt getchar()
#define ll long long
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
inline int in()
{
int k=0;char ch=gt;
while(ch<'-')ch=gt;
while(ch>'-')k=k*10+ch-'0',ch=gt;
return k;
}
const int N=305,M=1e5+5;
const double eps=1e-10,P=0.5;
int n,m,cnt,ch[M][2],head[M],to[M],nxt[M];
int pos[N],fa[M],sz[M],tot;
double p[N],G[N][N];
char s[N];
inline void add(int u,int v){to[++cnt]=v,nxt[cnt]=head[u],head[u]=cnt;}
#define v (ch[u][i])
inline void insert(int p)
{
scanf("%s",s+1);int u=0,i;
for(int j=1;j<=m;++j)i=s[j]=='H',sz[!v?v=++tot:v]=sz[u]+1,add(u=v,p);
pos[p]=u;
}
inline void build()
{
static int q[M];int h=1,t=0,u=0,i;
for(int i=0;i<=1;++i)if(v)q[++t]=v;
while(h<=t)for(u=q[h++],i=0;i<2;++i)v?fa[q[++t]=v]=ch[fa[u]][i]:v=ch[fa[u]][i];
}
#undef v
inline void calc(int x)
{
for(int u=pos[x];u;u=fa[u])
for(int i=head[u];i;i=nxt[i])
G[to[i]][x]+=p[m-sz[u]];
}
int o[N];
inline void Gauss(int n)
{
for(int i=1;i<=n;++i)
{
pos[i]=0;
for(int j=1;j<=n;++j)if(!o[j]&&G[j][i]){pos[i]=j;break;}
o[pos[i]]=1;double t=G[pos[i]][i];
for(int j=1;j<=n+1;++j)G[pos[i]][j]/=t;
for(int k=1;k<=n;++k)
if(pos[i]!=k)
{
t=G[k][i];
for(int j=1;j<=n+1;++j)G[k][j]-=G[pos[i]][j]*t;
}
}
}
int main()
{
n=in(),m=in();p[0]=1;for(int i=1;i<=m;++i)p[i]=p[i-1]*P;
for(int i=1;i<=n;++i)insert(i);build();
for(int i=1;i<=n;++i)calc(i);
for(int i=1;i<=n;++i)G[i][n+1]=-p[m],G[n+1][i]=1,G[n+1][n+2]=1;
Gauss(n+1);
for(int i=1;i<=n;++i)printf("%.10lf\n",G[pos[i]][n+2]);
return 0;
}

```\]

SDOI2017硬币游戏的更多相关文章

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

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

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

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

  3. 【BZOJ4820】[SDOI2017]硬币游戏(高斯消元)

    [BZOJ4820][SDOI2017]硬币游戏(高斯消元) 题面 BZOJ 洛谷 题解 第一眼的感觉就是构\(AC\)自动机之后直接高斯消元算概率,这样子似乎就是\(BZOJ1444\)了.然而点数 ...

  4. 4820: [Sdoi2017]硬币游戏

    4820: [Sdoi2017]硬币游戏 链接 分析: 期望dp+高斯消元. 首先可以建出AC自动机,Xi表示经过节点i的期望次数,然后高斯消元,这样点的个数太多,复杂度太大.但是AC自动机上末尾节点 ...

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

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

  6. 【BZOJ4820】[Sdoi2017]硬币游戏 AC自动机+概率DP+高斯消元

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

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

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

  8. luogu3706 [SDOI2017]硬币游戏

    LINK:硬币游戏 对于40分的暴力 构造出AC自动机 列出转移矩阵 暴力高消.右转上一篇文章. 对于100分 我们不难想到这个矩阵过大 且没有用的节点很多我们最后只要n个节点的答案 其他节点的答案可 ...

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

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

  10. BZOJ 4820 [SDOI2017] 硬币游戏

    Description 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利.大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬币实在是太单调了.同学们觉得要加强趣味性,所以要找 ...

随机推荐

  1. Redis初探(windows/linux安装)

    最近在学习Redis,先看看简介: Redis 是完全开源免费的,遵守BSD协议(可以自由的使用,修改源代码的协议,当然需要满足一定的条件),是一个高性能的key-value数据库. 特点&& ...

  2. 利用jsencrypt 做非对称加密

    1.生成 private key openssl genrsa -out rsa_1024_priv.pem 1024 2.生成public key openssl rsa -pubout -in r ...

  3. 基于Linux-3.9.4内核增加简单的时间片轮转功能

    简单的时间片轮转多道程序内核代码 原创作品转载请注明出处https://github.com/mengning/linuxkernel/ 作者:sa18225465 一.安装 Linux-3.9.4 ...

  4. 服务端模版注入漏洞检测payload整理

    服务端模版注入漏洞产生的根源是将用户输入的数据被模版引擎解析渲染可能导致代码执行漏洞 下表涵盖了java,php,python,javascript语言中可能使用到的模版引擎,如果网站存在服务端模版注 ...

  5. Redux和React-Redux的实现(一):Redux的实现和context

    react使用redux做状态管理,实现多个组件之间的信息共享,解决了父子组件.兄弟组件之间的复杂通信问题.vue有vuex,总之是一种flux的思想.react提供了react-redux这个库,一 ...

  6. 数据库,总结,新技能get

    上来先粘代码吧,这篇本来就不是用来让你们看的,我就是单纯的记录下,嗯~对,总结!!! 首先:first //绑定年份 YearSearch.Items.Clear(); for (int i = Da ...

  7. android--实现通过点击链接打开apk(应用图标在桌面消失)

    首先在AndroidManifest.xml的MAIN Activity下追加以下内容.(启动Activity时给予) ※必须添加项 <intent-filter> <action ...

  8. Software Defined Networking(Week 3, part 1)

    Control and Data Plane Seperation 课程地址 Overview 今天正式地学习一个控制与数据平面分离.学习完本节,应该要掌握何为控制和数据平面,了解它们的功能以及好处, ...

  9. Git查看与修改用户名、邮箱(转载)

    用户名和邮箱的作用: 用户名和邮箱地址相当于你的身份标识,是本地Git客户端的一个变量,不会随着Git库而改变. 每次commit都会用用户名和邮箱纪录. github的contributions跟你 ...

  10. 0428-Scrum团队成立

    ------------------------------3.0------------------------------------------ 一.项目要求 5.Scrum团队成立 5.1 团 ...