题目限制

时间限制 内存限制 评测方式 题目来源
1000ms 131072KiB 标准比较器 Local

题目背景

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位整型范围内。

输出格式

一行一个实数,表示中奖的概率(保留小数点后5位小数)。

提示

数据分布:
第1个点~第10个点,每个点5分;
第11个点~第15个点,每个点10分。

对于样例的解释:
随机序列一共有3^5=243个,其中包含"1"的个数为211个,则概率为211/243=0.86831Bob HAN

样例数据

输入样例 #1 输出样例 #1
5 1 3

1
0.86831

和Bzoj1030基本一样。

先对所有串建一个AC自动机。

然后设$f[i][j]$为写的长度为i,正在自动机的第j个节点的方案数。

设总方案数是$all$,那么答案就是(all - 不在末尾节点的方案数)/all。

记得上传结束标记,有结束标记的点不往外转移。


#include <bits/stdc++.h>
using namespace std;
#define reg register
#define int long long
#define N 400005
int n, m, r;
int nxt[N][], fail[N], end[N];
int tot;
int f[][N];
int all = , ans;
char s[]; inline void Ins()
{
int len = strlen(s);
int now = ;
for (reg int i = ; i < len ; i ++)
now = nxt[now][s[i]-''] ? nxt[now][s[i]-''] : nxt[now][s[i]-''] = ++tot;
end[now] = ;
}
inline void AC_Match()
{
queue <int> q;
for (reg int i = ; i <= ; i ++)
if (nxt[][i]) q.push(nxt[][i]);
while(!q.empty())
{
int x = q.front();q.pop();
for (reg int i = ; i <= r ; i ++)
{
if (nxt[x][i]) fail[nxt[x][i]] = nxt[fail[x]][i], q.push(nxt[x][i]);
else nxt[x][i] = nxt[fail[x]][i];
}
end[x] |= end[fail[x]];
}
} signed main()
{
scanf("%lld%lld%lld", &n, &m, &r);
for (reg int i = ; i <= m ; i ++)
{
scanf("%s", s);
Ins();
}
AC_Match();
f[][] = ;
for (reg int i = ; i < n ; i ++)
for (reg int x = ; x <= tot ; x ++)
{
if (end[x] or !f[i][x]) continue;
for (reg int j = ; j <= r ; j ++)
f[i + ][nxt[x][j]] += f[i][x];
}
for (reg int i = ; i <= n ; i ++) all *= r;
for (reg int i = ; i <= tot ; i ++)
if (!end[i]) ans += f[n][i];
printf("%.5lf\n", (double)(all - ans) / (double)all);
return ;
}

最新文章

  1. Android入门(二十二)解析JSON
  2. 《java中异常和错误》
  3. sharepoint learning resourse
  4. Spring mvc4 + ActiveMQ 整合
  5. iOS边练边学--父子控制器之自定义控制器的切换
  6. windows7环境下svn服务器的配置及使用
  7. IE chrome兼容问题
  8. C#使用DataSet类、DataTable类、DataRow类、OleDbConnection类、OleDbDataAdapter类编写简单数据库应用
  9. iOS App 性能优化总结
  10. TOGAF架构开发方法(ADM)之需求管理阶段
  11. 用python批量修改文件名
  12. iOS 多线程 简单学习NSThread NSOperation GCD
  13. React Fiber源码分析 第二篇(同步模式)
  14. codeforces559B
  15. [CI]jenkins安装&amp;插件管理&amp;java-helloworld之旅
  16. oracle死锁测试
  17. beta冲刺————第三天(3/5)
  18. Android之Activity切换
  19. Nonsense Alphabet
  20. 面试题思考:Servlet 生命周期、工作原理

热门文章

  1. Winform中跨窗体设置Zedgraph的属性并刷新曲线图
  2. 增删改查——PreparedStatement接口
  3. centos7搭建squid
  4. JAVA数据处理的常用技术
  5. [Leetcode] 第299题 猜数字游戏
  6. 【iOS】得到当前年、月、周的第一天和最后一天
  7. 12-z-index
  8. python import cv2异常(dll load fail / windows server 2008)
  9. 确认自己所用的python版本
  10. bat脚本自动安装Jmeter&amp;Jdk