1444: [Jsoi2009]有趣的游戏

题意:每种字母出现概率\(p_i\),有一些长度len的字符串,求他们出现的概率


套路DP的话,\(f[i][j]\) i个字符走到节点j的概率,建出转移矩阵来矩乘几十次可以认为是无穷个字符,就得到概率了

但我们发现Trie图也是图啊,直接高斯消元就好了,\(f[i]\)表示走到节点i的期望次数

注意\(f[0]\)需要+1

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=105;
const double eps=1e-8;
inline int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}int n, len, m, pos[N]; double p[N], x, y;
char s[N];
namespace ac{struct meow{int ch[11], fail, val;} t[N];int sz;void insert(char *s, int id) {int u=0;for(int i=1; i<=len; i++) {int c=s[i]-'A';if(!t[u].ch[c]) t[u].ch[c] = ++sz;u=t[u].ch[c]; }t[u].val=1; pos[id]=u;}int q[N], head, tail;void build() {head=tail=1;for(int i=0; i<m; i++) if(t[0].ch[i]) q[tail++] = t[0].ch[i];while(head!=tail) {int u=q[head++];t[u].val |= t[t[u].fail].val;for(int i=0; i<m; i++) {int &v = t[u].ch[i];if(!v) v = t[t[u].fail].ch[i];else t[v].fail = t[t[u].fail].ch[i], q[tail++]=v;}}}
}using ac::t; using ac::sz;double a[N][N];
namespace eq{void build() { a[0][sz+1] = 1;for(int i=0; i<=sz; i++) {  //printf("i %d\n",i);a[i][i]=1;if(!t[i].val) for(int j=0; j<m; j++) a[ t[i].ch[j] ][i] -= p[j];// printf("ch %d %lf  %d\n",j,p[j],t[i].ch[j]);}//for(int i=0; i<=n; i++) for(int j=0; j<=n+1; j++) printf("%lf%c",a[i][j],j==n+1?'\n':' ');}void gauss(int n) {for(int i=0; i<=n; i++) {int r=i;for(int j=i; j<=n; j++) if(abs(a[j][i])>abs(a[r][i])) r=j;if(r!=i) for(int j=0; j<=n+1; j++) swap(a[r][j], a[i][j]);for(int k=i+1; k<=n; k++) {double t = a[k][i]/a[i][i];for(int j=i; j<=n+1; j++) a[k][j] -= t*a[i][j];}}for(int i=n; i>=0; i--) {for(int j=n; j>i; j--) a[i][n+1] -= a[i][j]*a[j][n+1];a[i][n+1] /= a[i][i];}}
}
int main() {freopen("in","r",stdin);n=read(); len=read(); m=read(); int flag=0;for(int i=0; i<m; i++) x=read(), y=read(), p[i]=(double)x/y, flag |= p[i]>eps;if(!flag) {for(int i=1; i<=n; i++) puts("0.00"); return 0;}for(int i=1; i<=n; i++) scanf("%s",s+1), ac::insert(s, i);ac::build();eq::build(); eq::gauss(sz);//for(int i=1; i<=n; i++) printf("%d ",pos[i]); puts(" pos");for(int i=1; i<=n; i++) printf("%.2lf\n", a[pos[i]][sz+1]);
}

转载于:https://www.cnblogs.com/candy99/p/6666722.html

BZOJ 1444: [Jsoi2009]有趣的游戏 [AC自动机 高斯消元]相关推荐

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

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

  2. BZOJ 1444: [Jsoi2009]有趣的游戏

    1444: [Jsoi2009]有趣的游戏 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1114  Solved: 386 [Submit][Sta ...

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

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

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

    题目描述 输入 注意 是0<=P 输出 样例输入 样例输出 题解 AC自动机+矩阵乘法 先将所有字符串放到AC自动机中,求出Trie图. 然后构建邻接矩阵:如果x不是某个字符串的末位置,则x连向 ...

  5. BZOJ 1444 [JSOI2009]有趣的游戏 (Trie图/AC自动机+矩阵求逆)

    题目大意:给你$N$个长度相等且互不相同的模式串,现在有一个字符串生成器会不断生成字符,其中每个字符出现的概率是$p_{i}/q_{i}$,当生成器生成的字符串包含了某个模式串,则拥有该模式串的玩家胜 ...

  6. bzoj 4820: [Sdoi2017]硬币游戏 概率dp+高斯消元+KMP

    题意 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利. 大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬币实在是太单调了. 同学们觉得要加强趣味性,所以要找一个同学扔很多 ...

  7. bzoj 2844: albus就是要第一个出场 高斯消元

    LINK 题意:看题目不如看样例解释.给出有n个数的集合,对这些子集中的数求异或,升序统计所有子集得到的数(重复会被计入),询问一个数x,问这个数出现的第一个位置 思路:在这里要求一个所有可能出现的异 ...

  8. [BZOJ1444]有趣的游戏(AC自动机+矩阵乘法)

    n个等长字符串,机器会随机输出一个字符串(每个字母出现的概率为p[i]),问每个字符串第一个出现的概率是多少. 显然建出AC自动机,套路地f[i][j]表示i时刻位于节点j的概率. 构建转移矩阵,当i ...

  9. bzoj 1013: [JSOI2008]球形空间产生器sphere(高斯消元)

    1013: [JSOI2008]球形空间产生器sphere Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 5598  Solved: 2943 [Su ...

最新文章

  1. nn.embding()使用注意点
  2. 10年前腾讯微信后台第一天提交的代码曝光!
  3. 本地的文件怎么放到虚拟桌面_搬新家桌面文件怎么收纳?5个便宜实用的收纳神器,你买过几个?...
  4. 验证码类,生成验证码
  5. Swans and ducks, Piešťany, Slovakia
  6. Swiper4.5在vue项目中的使用方法
  7. ios换肤思想,及工具类
  8. 7-15 sdut-数据类型-4 第七次全国人口普查数据分析
  9. 莫烦PYTHON | Tensorflow教程——Tensorflow简介(第一章)
  10. ACCESS数据库联结表实现
  11. html两张图片无缝合成一张,怎么用PS把两张图片合成一张 PS无缝拼图边缘如何处理...
  12. 解决 WPS 输入文字颜色无法改变并自带下划线的问题
  13. Bing 无法访问临时解决方案
  14. linux之cut命令的用法
  15. 18.play依赖管理
  16. HNOI2008玩具装箱(T_OY)bzoj1010
  17. pm2 start 带参数_pm2 start命令中的json格式详解
  18. 2020年,给你7个程序员接私活必备网站!
  19. P2862 [USACO06JAN]Corral the Cows G
  20. 前端水平垂直居中的方法

热门文章

  1. mac 下终端 操作svn命令 以及出现证书错误的处理方法
  2. c++ 连接两个字符串实现代码 实现类似strcat功能(转)
  3. Android用Intent和Bundle传list
  4. oracle数据量大时候分区索引思路
  5. numpy数组提取一定规律的数据
  6. RUNOOB python练习题19 找出1000以内的所有完数
  7. oracle 性能优化 07_诊断事件
  8. 2018年,牛客网小白月赛5
  9. tomcat 指定的服务未安装(总结验证)
  10. 高计能计算要实现软着陆