这道题还比较友好~
首先,构建出来 $AC$ 自动机,那么我们要求的就是从 $0$ 号点走无限次走到一个终止节点的概率.
考虑构建转移矩阵 $M,$ $M_{i,j}$ 表示节点 $i$ 转移到节点 $j$ 的概率.
如果 $i$ 不是终止节点,则直接将概率相加即可,否则,只有 $M_{i,i}$ 为 $1,$ 其余为 $0.$
这么做目的:
如果碰到终止节点,那整个过程应该结束,换句话说终止节点不能对其他点有贡献.
如果碰到终止节点,那整个过程应该结束,所以无论再乘几次,终止节点的概率都应当完全保留,故 $M_{i,i}=1.$

#include <bits/stdc++.h>
#define N 103
#define setIO(s) freopen(s".in","r",stdin) , freopen(s".out","w",stdout)
using namespace std;
double perc[N],answer[N];
char str[N];
int tot;
queue<int>q;
struct Node
{
int f,ch[13],tag;
}t[N*10];
struct matrix
{
double a[N][N];
double*operator[](int x) { return a[x]; }
matrix() { memset(a,0,sizeof(a)); }
matrix friend operator*(matrix a,matrix b)
{
matrix c;
int i,j,k;
for(i=0;i<=tot;++i)
for(j=0;j<=tot;++j)
for(k=0;k<=tot;++k)
c[i][j]+=a[i][k]*b[k][j];
return c;
}
}mat;
int main()
{
// setIO("input");
int n,l,m,i,j,k;
scanf("%d%d%d",&n,&l,&m);
for(i=0;i<m;++i)
{
double a,b;
scanf("%lf%lf",&a,&b),perc[i]=1.0*a/b;
}
for(i=1;i<=n;++i)
{
int p=0;
scanf("%s",str+1);
for(j=1;j<=l;++j)
{
if(!t[p].ch[str[j]-'A']) t[p].ch[str[j]-'A']=++tot;
p=t[p].ch[str[j]-'A'];
}
t[p].tag=i;
}
for(i=0;i<m;++i) if(t[0].ch[i]) q.push(t[0].ch[i]);
while(!q.empty())
{
int u=q.front();q.pop();
for(i=0;i<m;++i)
{
int p=t[u].ch[i];
if(!p)
{
t[u].ch[i]=t[t[u].f].ch[i];
continue;
}
t[p].f=t[t[u].f].ch[i];
q.push(p);
}
}
for(i=0;i<=tot;++i)
{
if(t[i].tag) mat[i][i]=1.00;
else for(j=0;j<m;++j) mat[i][t[i].ch[j]]+=perc[j];
}
for(i=1;i<=60;++i) mat=mat*mat;
for(i=0;i<=tot;++i) if(t[i].tag) answer[t[i].tag]=mat[0][i];
for(i=1;i<=n;++i) printf("%.2f\n",answer[i]);
return 0;
}

  

BZOJ 1444: [Jsoi2009]有趣的游戏 AC自动机+概率与期望+矩阵乘法的更多相关文章

  1. BZOJ 1444 [Jsoi2009]有趣的游戏 (AC自动机 + 概率DP + Gauss)

    1444: [Jsoi2009]有趣的游戏 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1382  Solved: 498[Submit][Statu ...

  2. BZOJ 1444: [Jsoi2009]有趣的游戏 [AC自动机 高斯消元]

    1444: [Jsoi2009]有趣的游戏 题意:每种字母出现概率\(p_i\),有一些长度len的字符串,求他们出现的概率 套路DP的话,\(f[i][j]\) i个字符走到节点j的概率,建出转移矩 ...

  3. BZOJ 1444 [JSOI2009]有趣的游戏 (AC自动机、概率与期望DP、矩阵乘法)

    诶这题洛谷居然没有??? 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1444 题解: 我见到主要有三种做法. 一是矩阵乘法.设\(d ...

  4. 【BZOJ1444】[Jsoi2009]有趣的游戏 AC自动机+概率DP+矩阵乘法

    [BZOJ1444][Jsoi2009]有趣的游戏 Description Input 注意 是0<=P Output Sample Input Sample Output HINT  30%的 ...

  5. BZOJ1444[Jsoi2009]有趣的游戏——AC自动机+概率DP+矩阵乘法

    题目描述 输入 注意 是0<=P, n , l, m≤ 10. 输出 样例输入 input 1 3 2 2 1 2 1 2 AB BA AA input 2 3 4 2 1 2 1 2 AABA ...

  6. BZOJ 1444:[JSOI2009]有趣的游戏

    BZOJ 1444:[JSOI2009]有趣的游戏 题目链接 首先我们建出Trie图,然后高斯消元. 我们设\(f_i\)表示经过第\(i\)个点的期望次数: \[ f_x=\sum i\cdot p ...

  7. BZOJ:4820: [Sdoi2017]硬币游戏&&BZOJ:1444: [Jsoi2009]有趣的游戏(高斯消元求概率)

    1444: [Jsoi2009]有趣的游戏 4820: [Sdoi2017]硬币游戏 这两道题都是关于不断随机生成字符后求出现给定字符串的概率的问题. 第一题数据范围较小,将串建成AC自动机以后,以A ...

  8. ●BZOJ 1444 [Jsoi2009]有趣的游戏

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1444题解.1: 概率dp,矩阵乘法,快速幂. 对所有串建立AC自动机, 那么如果在trie树 ...

  9. bzoj 1444: [Jsoi2009]有趣的游戏【AC自动机+dp+高斯消元】

    https://blog.sengxian.com/solutions/bzoj-1444 orz 一直是我想错了,建出AC自动机之后,实际上这个定义是设f[i]为经过i节点的 * 期望次数 * ,因 ...

随机推荐

  1. centerOS7安装lnmp环境

    视频地址: https://www.bilibili.com/video/av55251610?p=65 安装nginx http://nginx.org 点击 download vim /etc/y ...

  2. Linux操作系统文档

    一 Linux操作系统概述 l为什么要学习Linux操作系统: 1.  大部分服务端都是使用Linux操作系统(Django,爬虫,科学运算等项目是部署到服务器中的) 2.  一些企业和学校(国外学校 ...

  3. kubernetes dashboard访问用户添加权限控制

    前面我们在kubernetes dashboard 升级之路一文中成功的将Dashboard升级到最新版本了,增加了身份认证功能,之前为了方便增加了一个admin用户,然后授予了cluster-adm ...

  4. Lua 截取字符串(截取utf-8格式字符串)

    对utf-8完全没概念的可以看看我上一篇随笔:简单说说utf-8编码格式 另外,还要知道string.sub 和 string.byte 的用法. 先上完整代码: local StringHelper ...

  5. 解决maven依赖包下载慢的问题

    修改maven 目录下setting.xml配置文件 在mirrors中添加如下配置即可 <mirror> <id>alimaven</id> <name&g ...

  6. fork 代码进阶

    fork进阶知识 先看一份代码: [cpp] view plain copy /* *  fork_test.c *  version 2 *  Created on: 2010-5-29 *     ...

  7. 向PHP发送HTTP-Get请求

    1.get.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  8. GraphX介绍

    转自:https://www.cnblogs.com/txq157/p/5978747.html 1.GraphX介绍 1.1 GraphX应用背景 Spark GraphX是一个分布式图处理框架,它 ...

  9. 认识并初步应用GitHub

    好好学习,天天向上 一.这是一个简单的开头 GIT的地址 https://github.com/Notexcellent GIT的用户名 Notexcxllent 学号后五位 82405 博客地址 h ...

  10. 如何在VPC中安装Ubuntu

    在虚拟机 VPC2007 中安装Ubuntu 方法A:(断网络连接) 1.用载入ISO镜像启动一台标准的 xp设置的虚拟机 2.按 F4 选择启动模式,选择图形模式并确认. 3.按 F6 在启动配置中 ...