博彩游戏(tyvj 1519)
2024-08-25 07:10:22
背景
Bob最近迷上了一个博彩游戏……
描述
这个游戏的规则是这样的:
每花一块钱可以得到一个随机数R,花上N块钱就可以得到一个随机序列;
有M个序列,如果某个序列是产生的随机序列的子串,那么就中奖了,否则不中。
Bob会告诉你这M个序列,和身上有的钱的总数N,当然还有R的范围。
请你告诉Bob中奖的概率有多少?
每花一块钱可以得到一个随机数R,花上N块钱就可以得到一个随机序列;
有M个序列,如果某个序列是产生的随机序列的子串,那么就中奖了,否则不中。
Bob会告诉你这M个序列,和身上有的钱的总数N,当然还有R的范围。
请你告诉Bob中奖的概率有多少?
输入格式
第一行三个用空格隔开的数N、M和R的范围R。
其中1<=R<=9,0<N<=60,0<M<=20000。
下面M行每行一个字符串(长度小于等于20),字符串的每一位范围在1-r之间
保证必要运算都在64位整型范围内。
其中1<=R<=9,0<N<=60,0<M<=20000。
下面M行每行一个字符串(长度小于等于20),字符串的每一位范围在1-r之间
保证必要运算都在64位整型范围内。
输出格式
一行一个实数,表示中奖的概率(保留小数点后5位小数)。
测试样例1
输入
5 1 3
1
输出
0.86831
备注
数据分布:
第1个点~第10个点,每个点5分;
第11个点~第15个点,每个点10分。
第1个点~第10个点,每个点5分;
第11个点~第15个点,每个点10分。
对于样例的解释:
随机序列一共有3^5=243个,其中包含"1"的个数为211个,则概率为211/243=0.86831Bob HAN
/*
AC自动机+DP
f[i][j]表示将字符串扩展到i,在自动机上匹配到j的概率。
因为合法概率较难统计,所以最后答案为 1-不合法的概率。
要滚动一下数组。
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#define N 400010
#define eps 0.000000001
using namespace std;
int a[N][],danger[N],point[N],n,m,r,size=;
double f[][N];char s[N];
queue<int> q;
void insert(){
int len=strlen(s),now=;
for(int i=;i<len;i++){
int t=s[i]-'';
if(!a[now][t]) a[now][t]=++size;
now=a[now][t];
}
danger[now]=;
}
void build(){
q.push();point[]=;
while(!q.empty()){
int now=q.front();q.pop();
for(int i=;i<=r;i++){
if(!a[now][i]){
a[now][i]=a[point[now]][i];
continue;
}
int k=point[now];
while(!a[k][i]) k=point[k];
point[a[now][i]]=a[k][i];
danger[a[now][i]]|=danger[point[a[now][i]]];
q.push(a[now][i]);
}
}
}
void dp(){
f[][]=;
for(int i=;i<=n;i++){
for(int j=;j<=size;j++){
if(danger[j]||f[i+&][j]<eps) continue;
for(int t=;t<=r;t++){
int k=j;
while(!a[k][t]) k=point[k];
f[i&][a[k][t]]+=f[i+&][j]/(double)r;
}
}
for(int j=;j<=size;j++)
f[i+&][j]=;
}
}
int main(){
scanf("%d%d%d",&n,&m,&r);
for(int i=;i<=r;i++) a[][i]=;
for(int i=;i<=m;i++){
scanf("%s",s);
insert();
}
build();dp();
double ans=;
for(int i=;i<=size;i++)
if(!danger[i]) ans+=f[n&][i];
printf("%.5f",1.0-ans);
return ;
}
最新文章
- 文件处理命令:awk
- OC----面向对象
- 3.Mybatis全局配置文件属性详解(SqlMapConfig.xml)
- mysql 优化配置参数详解
- Hadoop科普文——常见的45个问题解答(CSDN)
- 在指定的DSN中,驱动程序和应用程序之间的体系结构不匹配
- 【转】Xcode7.1环境下上架iOS App到AppStore 流程 (Part 一)
- Activity生命周期回顾
- JS 移动动画
- Windows 7中怎样找到真正的Administrator账户
- iOS ARC与MRC混编的一些解决方法
- Quill编辑器介绍及扩展
- 分享:Python中的位运算符
- poj 2451 Uyuw&#39;s Concert
- NuGet包断线续传下载
- Android layout_margin 无效的解决办法
- MySQL中SELECT语句简单使用
- 对Swoole、Workerman和php自带的socket的理解
- shell 按序删除文件
- mysql 时间戳转换 、cnd、dns 通俗理解
热门文章
- opensue ";Have a lot of fun...";的出处
- JavaScript无提示关闭当前页面窗口,兼容IE/Firefox/Chrome
- javascript 完整知识点整理
- Java第7次作业:造人类(用private封装,用static关键字自己造重载输出方法)什么是面向对象程序设计?什么是类和对象?什么是无参有参构造方法 ?什么是封装?
- attachEvent和addEventListener 的使用方法和区别
- centos 安装 python3 分类链接
- 我如何解决Centos下cannot find a valid baseurl for repo的问题的
- GoogleTest 之路3-Mocking Framework
- lavarel 添加自定义辅助函数
- drf分页器