题面链接

洛咕

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;
}

```\]

最新文章

  1. ASP.NET Core 中文文档 第二章 指南(4.2)添加 Controller
  2. Oozie 快速入门
  3. 去除magento多店铺URL地址中的“___from_store=”
  4. EntityFramework Reverse POCO Generator工具
  5. JNI系列——简便开发流程
  6. 黑马程序员:Java编程_多线程
  7. Mysql函数instr、locate、position VS like
  8. Visual Studio Online Integrations-Other
  9. http://blog.csdn.net/jbb0403/article/details/42102527
  10. 单/多行文本添加省略号 (o゚ω゚o)
  11. php5.5新特性之yield理解
  12. java Process在windows的使用汇总(转)
  13. [补] windows C socket编程——大物实验预约
  14. 最全面的Redis命令行查阅手册(收藏查看)
  15. edgedb 集成timescaledb
  16. git 忽略无效解决办法
  17. Unity 后处理堆
  18. Jetpack 架构组件 LiveData ViewModel MD
  19. JavaScript中子类调用父类方法的实现
  20. Python:GUI之tkinter学习笔记3事件绑定

热门文章

  1. Jenkins远程测试
  2. Python中的常规习题
  3. MySQL(MariaDB)基础之一:编译安装
  4. (第十周)新NABCD
  5. 2018-2019-20172329 《Java软件结构与数据结构》第九周学习总结
  6. Beta Scrum Day 5 — 听说
  7. ubuntu16.04+pycharm+默认文件头注释
  8. spring--两个数据源模板
  9. POJ 2441 Arrange the Bulls 状压dp
  10. mysql 性能分析及explain用法