题目描述

输入

注意 是0<=P

输出

样例输入

样例输出


题解

AC自动机+矩阵乘法

先将所有字符串放到AC自动机中,求出Trie图。

然后构建邻接矩阵:如果x不是某个字符串的末位置,则x连向next[x][i],边权为pi/qi;否则x只连向x,边权为1。

然后这个矩阵的无穷次方即为答案。

由于这个矩阵乘了很多次后概率基本不变,可以认定为答案。所以我们可以将这个矩阵自乘50次(相当于求出这个矩阵的2^50次方),得出答案。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <queue>
  4. #define N 12
  5. #define M 110
  6. using namespace std;
  7. queue<int> q;
  8. double p[N];
  9. int pos[N] , next[M][N] , fail[M] , tag[M], tot = 1 , m;
  10. char str[N];
  11. struct data
  12. {
  13. double v[M][M];
  14. data() {memset(v , 0 , sizeof(v));}
  15. data operator*(const data a)const
  16. {
  17. data ans;
  18. int i , j , k;
  19. for(i = 1 ; i <= tot ; i ++ )
  20. for(j = 1 ; j <= tot ; j ++ )
  21. for(k = 1 ; k <= tot ; k ++ )
  22. ans.v[i][j] += v[i][k] * a.v[k][j];
  23. return ans;
  24. }
  25. }A;
  26. void build()
  27. {
  28. int x , i;
  29. for(i = 0 ; i < m ; i ++ ) next[0][i] = 1;
  30. q.push(1);
  31. while(!q.empty())
  32. {
  33. x = q.front() , q.pop();
  34. for(i = 0 ; i < m ; i ++ )
  35. {
  36. if(next[x][i]) fail[next[x][i]] = next[fail[x]][i] , q.push(next[x][i]);
  37. else next[x][i] = next[fail[x]][i];
  38. }
  39. }
  40. }
  41. int main()
  42. {
  43. int n , l , i , j , x , y;
  44. scanf("%d%d%d" , &n , &l , &m);
  45. for(i = 0 ; i < m ; i ++ ) scanf("%d%d" , &x , &y) , p[i] = (double)x / y;
  46. for(i = 1 ; i <= n ; i ++ )
  47. {
  48. scanf("%s" , str + 1);
  49. for(x = j = 1 ; j <= l ; j ++ )
  50. {
  51. if(!next[x][str[j] - 'A']) next[x][str[j] - 'A'] = ++tot;
  52. x = next[x][str[j] - 'A'];
  53. }
  54. pos[i] = x , tag[x] = 1;
  55. }
  56. build();
  57. for(i = 1 ; i <= tot ; i ++ )
  58. {
  59. if(tag[i]) A.v[i][i] = 1;
  60. else for(j = 0 ; j < m ; j ++ ) A.v[i][next[i][j]] += p[j];
  61. }
  62. for(i = 1 ; i <= 50 ; i ++ ) A = A * A;
  63. for(i = 1 ; i <= n ; i ++ ) printf("%.2lf\n" , A.v[1][pos[i]]);
  64. return 0;
  65. }

【bzoj1444】[Jsoi2009]有趣的游戏 AC自动机+矩阵乘法的更多相关文章

  1. BZOJ1444:[JSOI2009]有趣的游戏(AC自动机,矩阵乘法)

    Description Input 注意 是0<=P, n , l, m≤ 10. Output Sample Input input 1 3 2 2 1 2 1 2 AB BA AA inpu ...

  2. [日常摸鱼]bzoj1444 [JSOI2009]有趣的游戏——AC自动机+矩阵

    今天学校跳蚤市场摆摊聚众吸毒打call,东西卖了一百多好开心_(:з」∠)_ (然后大家中午就去吃了一顿好的x) 下午听演讲然后现在来填坑orz(其实是昨晚的坑) 题目:bzoj1444 先用字符串构 ...

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

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

  4. 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 ...

  5. bzoj1444[Jsoi2009]有趣的游戏[AC自动机]

    题面 bzoj 我要向师父学习善待每一只数据结构 考虑成环,那么高斯消元 然鹅这道题太小了 所以直接转移矩阵自乘就好啦 终点不向外连边 有一条向自己的,概率为一的自环来作为结尾 对于其他店 若有边\( ...

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

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

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

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

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

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

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

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

随机推荐

  1. nagios的一些东西

    make install 用来安装nagios的主程序,cgi和html文件 make install-init 在/etc/rc.d/init.d目录下创建nagios启动脚本 make insta ...

  2. LR中常见请求的使用示例

    Action(){ //application/x-www-form-urlencoded //application/json //web_add_auto_header("Content ...

  3. java+spring 执行器

    A 通过MethodInvokingJobDetailFactoryBean类实现 spring配置文件里增加执行器配置 <bean id="ammoDue" class=& ...

  4. MYSQL 中随机读取一条数据

    SELECT * FROM res AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM res) - (SELECT MIN(id) FRO ...

  5. 6.3 lambda 表达式

    6.3.1 lambda 表达式是一个可传递的代码块,可以在以后执行一次或者多次. 思考(如何按指定时间间隔完成工作,将这个工作放在一个ActionListener的actionPerformed方法 ...

  6. Hermite 矩阵的特征值不等式

    将要学习 关于 Hermite 矩阵的特征值不等式. Weyl 定理 以及推论.   Weyl 定理 Hermann Weyl 的如下定理是大量不等式的基础,这些不等式要么涉及两个 Hermite 矩 ...

  7. 【page-monitor 前端自动化 中篇】 源码分析

    转载文章:来源(靠谱崔小拽) 上篇中初探了page-monitor的一些功能和在前端自动化测试方面的可行性,本篇主要分析下page-monitor的实现方式和源码. mode-module简介 pag ...

  8. vue for循环中常见问题 之 求和(合计)

    例:求后台返回数据this.dataInfo 中某个字段(item.totalSum)的和,只需添加computed,然后模板中直接可以使用totalSumAll (不需要再data中声明) comp ...

  9. AspNetCore容器化(Docker)部署(三) —— Docker Compose容器编排

    一.前言 上一篇部署了一个最基础的helloworld应用,创建了两个容器和一个network,还算应付得过来. 如果该应用继续引入mysql.redis.job等若干服务,到时候发布一次得工作量之大 ...

  10. [BZOJ2938]病毒 (AC自动机+dfs)

    题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已经找出了所有的病毒代码段,试问,是否 ...