BZOJ4820 [SDOI2017]硬币游戏
BZOJ4820 [SDOI2017]硬币游戏
题面:BZOJ
解析
考虑把所有没有到达结束状态的字符串看做一类字符串\(N\),把以字符串\(i\)作为结束的一类字符串\(i\)。现在假设猜测了两个字符串\(A=TTH\),\(B=HTT\),不难发现可以列一个方程出来:
\[P(NTTH)=P(A)\]
遗憾的是,这个方程是错的,因为在\(N\)向后匹配的过程中,有可能先一步匹配其他字符串,比如\(N\)以\(HT\)结尾,只要加上一个\(T\),就以\(B\)结束了,我们试着把它写进方程里面,有:
\[P(NTTH)=P(A)+P(BTH)+P(BH)\]
写作带系数的形式:
\[0.125P(N)=P(A)+0.25P(B)+0.5P(B)\]
不难发现只要一个字符串\(B\)的后缀为字符串\(A\)的前缀,在\(A\)对应的方程里就有一个贡献,这个不难,随便用个字符串算法就能处理。
那么我们可以对\(n\)个字符串分别列出方程,再加上所有\(P(i)\)概率之和为1,一共\(n+1\)个方程,\(n+1\)个变量,高斯消元即可。
代码
#include<cmath>
#include<queue>
#include<cstdio>
#define N 305using namespace std;int n,m,s[N][N]; char str[N];inline int In(){char c=getchar(); int x=0,ft=1;for(;c<'0'||c>'9';c=getchar()) if(c=='-') ft=-1;for(;c>='0'&&c<='9';c=getchar()) x=x*10+c-'0';return x*ft;
}int h[N*N],e_tot=0;
struct E{ int to,nex; }e[N*N];inline void add(int u,int v){e[++e_tot]=(E){v,h[u]}; h[u]=e_tot;
}int rt=0,T_tot=0,ch[N*N][2],fail[N*N],d[N*N];inline void Insert(int i){int u=rt;for(int j=0;j<m;++j){if(!ch[u][s[i][j]]) ch[u][s[i][j]]=++T_tot;u=ch[u][s[i][j]]; add(u,i);}
}inline void Get_fail(int m){queue<int> Q; fail[rt]=rt;for(int i=0,v;i<=m;++i){v=ch[rt][i]; if(!v) continue;Q.push(v); fail[v]=rt; d[v]=1;}while(!Q.empty()){int u=Q.front(); Q.pop();for(int i=0,p,v;i<=m;++i){v=ch[u][i]; if(!v) continue;Q.push(v); p=fail[u];while(p&&!ch[p][i]) p=fail[p];fail[v]=ch[p][i]; d[v]=d[u]+1;}}
}double a[N][N],p[N],ans[N];inline void Get_v(int u,int B){if(!u) return;for(int i=h[u];i;i=e[i].nex) a[e[i].to][B]-=p[m-d[u]];Get_v(fail[u],B);
}inline void Get_a(){for(int i=1;i<=n;++i) a[i][n+1]=p[m];for(int i=1,u;i<=n;++i){u=rt;for(int j=0;j<m;++j){while(u&&!ch[u][s[i][j]]) u=fail[u];u=ch[u][s[i][j]];}Get_v(u,i);}for(int i=1;i<=n;++i) a[n+1][i]=1.0; a[n+1][n+2]=1.0;
}inline void Gauss(int n){for(int i=1,q;i<=n;++i){q=i;for(int j=i+1;j<=n;++j)if(fabs(a[j][i])>fabs(a[q][i])) q=j;swap(a[i],a[q]);for(int j=n+1;j>=i;--j)a[i][j]=a[i][j]/a[i][i];for(int j=i+1;j<=n;++j)for(int k=n+1;k>=i;--k)a[j][k]-=a[i][k]*a[j][i];}for(int i=n;i;--i){ans[i]=a[i][n+1];for(int j=i+1;j<=n;++j)ans[i]-=a[i][j]*ans[j];}
}int main(){n=In(); m=In(); p[0]=1.0;for(int i=1;i<=m;++i) p[i]=0.5*p[i-1];for(int i=1;i<=n;++i){scanf("%s",str);for(int j=0;j<m;++j) s[i][j]=(str[j]=='H');Insert(i);}Get_fail(1); Get_a(); Gauss(n+1);for(int i=1;i<=n;++i) printf("%.10lf\n",ans[i]);return 0;
}
转载于:https://www.cnblogs.com/pkh68/p/10643492.html
BZOJ4820 [SDOI2017]硬币游戏相关推荐
- bzoj4820 [Sdoi2017]硬币游戏 高斯消元+概率+kmp
有环的概率是可以高斯消元的 由于匹配情况可能从一个串转移到另一个串,所以需要建一个转移关系的图 就可以建一个ac自动机,但节点数是nm的.就可以设未知数,然后凑一些方程. 设N表示没有任何人获胜的概率 ...
- bzoj4820[SDOI2017]硬币游戏
题意 给出n个长度均为m的不同01串,随机生成一个无限长的01串,对n个01串中的每个,求出它最先在随机串中出现的概率. 分析 写这个题的题解比写这个题还难...我可能学了假的概率DP...假装我理解 ...
- 【BZOJ4820】[SDOI2017]硬币游戏(高斯消元)
[BZOJ4820][SDOI2017]硬币游戏(高斯消元) 题面 BZOJ 洛谷 题解 第一眼的感觉就是构\(AC\)自动机之后直接高斯消元算概率,这样子似乎就是\(BZOJ1444\)了.然而点数 ...
- [Sdoi2017]硬币游戏 [高斯消元 KMP]
[Sdoi2017]硬币游戏 题意:硬币序列,H T等概率出现,\(n \le 300\)个人猜了一个长为$ m \le 300$的字符串,出现即获胜游戏结束.求每个人获胜概率 考场用了[1444: ...
- P3706 [SDOI2017]硬币游戏
P3706 [SDOI2017]硬币游戏 题目描述 Solution 前置技能: P4548 [CTSC2006]歌唱王国 歌唱王国就是n=1n=1n=1的情况. 我们用类似的方法,先考虑两个串的情况 ...
- BZOJ:4820: [Sdoi2017]硬币游戏BZOJ:1444: [Jsoi2009]有趣的游戏(高斯消元求概率)
1444: [Jsoi2009]有趣的游戏 4820: [Sdoi2017]硬币游戏 这两道题都是关于不断随机生成字符后求出现给定字符串的概率的问题. 第一题数据范围较小,将串建成AC自动机以后,以A ...
- bzoj 4820: [Sdoi2017]硬币游戏 概率dp+高斯消元+KMP
题意 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利. 大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬币实在是太单调了. 同学们觉得要加强趣味性,所以要找一个同学扔很多 ...
- [SDOI2017]硬币游戏
考虑生成函数来做 g(x)函数就是0+0*x+...+1*x^s+...+|∑|^(n-s)x^n 就是最后s位必须填这个串,但是前面随便填的方案数 然后枚举之前出现了哪个串(包括自己),如果没有相交 ...
- BZOJ.4820.[SDOI2017]硬币游戏(思路 高斯消元 哈希/AC自动机/KMP)
BZOJ 洛谷 建出AC自动机,每个点向两个儿子连边,可以得到一张有向图.参照 [SDOI2012]走迷宫 可以得到一个\(Tarjan\)+高斯消元的\(O((nm)^3)\)的做法.(理论有\(6 ...
最新文章
- django项目用 setuptools打包构建(待更新)
- Protocol Buffer序列化协议及应用
- python线上编辑问题_大型线上项目中动态语言诸多问题之二 -- 以 Python 语言为例...
- 第五节 面向对象相关特性
- 废芯片做出来的艺术品!值得一看!
- Day 9 函数的初识1
- pure-ftpd搭建教程
- spark性能调优:资源优化
- 写了一套优雅接口之后,领导让我给大家讲讲这背后的技术原理
- cad导出jpg格式什么像素最清晰
- python井字格游戏_python实现简单井字棋游戏
- 投资转型:实体店铺,投资经营复盘
- TR069协议向导——一个帮助你了解TR069协议的简明教程(一)
- UCloud优刻得创始人季昕华:深耕云计算,做隐私计算赛道的“奇袭军”
- WLAN框架应用笔记
- 虚拟同步电机(VSG)调频动态特性和控制参数对储能配置的影响
- 根据年月日判断该日是这一年的多少天 C语言
- Prometheus浅析
- gd32f470总结
- Orbit Downloader 1.5.4多国语言版