[bzoj4820][Sdoi2017]硬币游戏
来自FallDream的博客,未经允许,请勿转载,谢谢。
n,m<=300
只会(nm)^3的做法....正解太神啦。
令N表示什么都没匹配到的状态,然后我计算在后面接上一个串的概率
注意到N是什么其实是不确定的,也就是可能还没全部接上去就接好了
更详细地,假设A=HTT,B=TTH
那么p(N+A)=p(A)+p(B)*2^(-1)+p(B)*2^(-2)
p(N+A)=p(N)*2^(-3)
也就是说,有一个串的后缀是我的前缀的时候,它会影响我的概率。
求这种情况可以用kmp
这样就列出了n个方程,在加上一个概率和等于1的方程,就能得到n+1个变量n+1个方程 高斯消元即可。
复杂度n^3
#include<iostream>
#include<cstdio>
#define MN 300
#define ld long double
using namespace std;
inline int read()
{
int x = , f = ; char ch = getchar();
while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x * f;
} int n,m,fail[MN+][MN+];
char st[MN+][MN+];
ld a[MN+][MN+],p[MN+],ans[MN+]; void BuildFail(char*s,int*f)
{
for(int i=,j=;i<=m;++i)
{
while(j&&s[j+]!=s[i]) j=f[j];
if(s[j+]==s[i])++j;f[i]=j;
}
} ld Calc(int y,int x)
{
ld ans=;int j=;
for(int i=;i<=m;++i)
{
while(j&&st[y][j+]!=st[x][i]) j=fail[y][j];
if(st[y][j+]==st[x][i]) ++j;
}
for(;j;) ans+=p[m-j],j=fail[y][j];
return ans;
} void Gauss()
{
for(int i=;i<=n+;++i)
{
for(int j=i;j<=n+;++j)
if(a[j][i])
{
if(j!=i)
for(int k=i;k<=n+;++k)
swap(a[j][k],a[i][k]);
break;
}
for(int j=i+;j<=n+;++j)
{
ld delta=a[j][i]/a[i][i];
for(int k=i;k<=n+;++k)
a[j][k]=a[j][k]-a[i][k]*delta;
}
}
for(int i=n+;i;--i)
{
for(int j=i+;j<=n+;++j)
a[i][n+]-=a[i][j]*ans[j];
ans[i]=a[i][n+]/a[i][i];
}
} int main()
{
n=read();m=read();p[]=;
for(int i=;i<=m;++i) p[i]=p[i-]/;
for(int i=;i<=n;++i)
scanf("%s",st[i]+),a[i][n+]=-p[m];
for(int i=;i<=n;++i) a[n+][i]=;a[n+][n+]=;
for(int i=;i<=n;++i) BuildFail(st[i],fail[i]);
for(int i=;i<=n;++i)
for(int j=;j<=n;++j)
a[i][j]=Calc(i,j);
Gauss();
for(int i=;i<=n;++i) printf("%.10lf\n",(double)ans[i]);
return ;
}
[bzoj4820][Sdoi2017]硬币游戏的更多相关文章
- BZOJ4820 Sdoi2017 硬币游戏 【概率期望】【高斯消元】【KMP】*
BZOJ4820 Sdoi2017 硬币游戏 Description 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利.大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬币实 ...
- [BZOJ4820][SDOI2017]硬币游戏(高斯消元+KMP)
比较神的一道题,正解比较难以理解. 首先不难得出一个(nm)^3的算法,对所有串建AC自动机,将在每个点停止的概率作为未知数做高斯消元即可. 可以证明,AC自动机上所有不是模式串终止节点的点可以看成一 ...
- BZOJ4820 SDOI2017硬币游戏(概率期望+高斯消元+kmp)
容易想到的做法是建出AC自动机,高斯消元.然而自动机上节点数量是nm的. 注意到我们要求的变量只有n个,考虑将其他不用求的节点合并为一个变量.这个变量即表示随机生成一个串,其不包含任何一个模板串的概率 ...
- 【BZOJ4820】[SDOI2017]硬币游戏(高斯消元)
[BZOJ4820][SDOI2017]硬币游戏(高斯消元) 题面 BZOJ 洛谷 题解 第一眼的感觉就是构\(AC\)自动机之后直接高斯消元算概率,这样子似乎就是\(BZOJ1444\)了.然而点数 ...
- 【BZOJ4820】[Sdoi2017]硬币游戏 AC自动机+概率DP+高斯消元
[BZOJ4820][Sdoi2017]硬币游戏 Description 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利.大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬 ...
- BZOJ:4820: [Sdoi2017]硬币游戏&&BZOJ:1444: [Jsoi2009]有趣的游戏(高斯消元求概率)
1444: [Jsoi2009]有趣的游戏 4820: [Sdoi2017]硬币游戏 这两道题都是关于不断随机生成字符后求出现给定字符串的概率的问题. 第一题数据范围较小,将串建成AC自动机以后,以A ...
- [Sdoi2017]硬币游戏 [高斯消元 KMP]
[Sdoi2017]硬币游戏 题意:硬币序列,H T等概率出现,\(n \le 300\)个人猜了一个长为$ m \le 300$的字符串,出现即获胜游戏结束.求每个人获胜概率 考场用了[1444: ...
- 4820: [Sdoi2017]硬币游戏
4820: [Sdoi2017]硬币游戏 链接 分析: 期望dp+高斯消元. 首先可以建出AC自动机,Xi表示经过节点i的期望次数,然后高斯消元,这样点的个数太多,复杂度太大.但是AC自动机上末尾节点 ...
- [BZOJ 4820] [SDOI2017] 硬币游戏(高斯消元+概率论+字符串hash)
[BZOJ 4820] [SDOI2017] 硬币游戏(高斯消元+概率论+字符串hash) 题面 扔很多次硬币后,用H表示正面朝上,用T表示反面朝上,会得到一个硬币序列.比如HTT表示第一次正面朝上, ...
随机推荐
- python简单路由系统
# 输入模块名/函数 url = input('请输入网址:') module,func = url.split('/') m = __import__('lib.'+module,fromlist= ...
- 教你在不使用框架的情况下也能写出现代化 PHP 代码
我为你们准备了一个富有挑战性的事情.接下来你们将以 无 框架的方式开启一个项目之旅. 首先声明, 这篇并非又臭又长的反框架裹脚布文章.也不是推销 非原创 思想 .毕竟, 我们还将在接下来的开发之旅中使 ...
- 【转】Python处理wave文件
#本文PDF版下载 Python解析Wav文件并绘制波形的方法 #本文代码下载 Wav波形绘图代码 #本文实例音频文件night.wav下载 音频文件下载 (石进-夜的钢琴曲) 前言 在现在繁忙的生活 ...
- C# 使用 ffmpeg 进行音频转码
先放一下 ffmpeg 的官方文档以及下载地址: 官方文档:http://ffmpeg.org/ffmpeg.html 下载地址:http://ffmpeg.org/download.html 用 f ...
- Python 黑客相关电子资源和书籍推荐
原创 2017-06-03 玄魂工作室 玄魂工作室 继续上一次的Python编程入门的资源推荐,本次为大家推荐的是Python网络安全相关的资源和书籍. 在去年的双11送书的时候,其实送过几本Pyth ...
- Python内置函数(17)——chr
英文文档: chr(i) Return the string representing a character whose Unicode code point is the integer i. F ...
- hadoop2.6.0实践:控制台入口url列表
hadoop web控制台页面的端口整理: 50070:hdfs文件管理 8088:ResourceManager 8042:NodeManager 19888:JobHistory(使用" ...
- JWT(JSON Web Token) 多网站的单点登录,放弃session
多个网站之间的登录信息共享, 一种解决方案是基于cookie - session的登录认证方式,这种方式跨域比较复杂. 另一种替代方案是采用基于算法的认证方式, JWT(json web token) ...
- Docker学习笔记 - Docker的容器
docker logs [-f] [-t] [--tail] 容器名 -f -t --tail="all" 无参数:返回所有日志 -f 一直跟踪变化并返回 -t 带时间戳返 ...
- power designer 连接mysql提示“connection test failed”
本机环境: win10 64位 jdk8 64位 问题: 测试连接时,总是提示 根据网上搜索: 根源在于:PowerDesigner based on 32 bit JVM kernel 参考: ht ...