Description

Input

注意 是0<=P, n , l, m≤ 10.

Output

Sample Input

input 1
3 2 2
1 2
1 2
AB
BA
AA
input 2
3 4 2
1 2
1 2
AABA
ABAA
BAAA

Sample Output

output 1
0.25
0.50
0.25

output 2
0.31
0.33
0.37

解题思路:

可以理解为Trie上倍增佛洛依德做矩乘累和。

代码:

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 struct trnt{
  5     int ch[26];
  6     int fl;
  7     bool fin;
  8 }tr[111];
  9 class queue{
 10     public:
 11         queue(void){h=1,t=0;return ;}
 12         int nxt(int x){if(x+1>=999)return 1;return x+1;}
 13         void push(int x){t=nxt(t);line[t]=x;return ;}
 14         void pop(void){h=nxt(h);return ;}
 15         bool empty(void){return nxt(t)==h;}
 16         int front(void){return line[h];}
 17     private:
 18         int h,t,line[1000];
 19 }Q;
 20 int siz;
 21 int n,m,l;
 22 int ansp[111];
 23 char tmp[111];
 24 double lst[111];
 25 double ans[111];
 26 double martix[111][111];
 27 double temp[111][111];
 28 double pre[30];
 29 void Insert(char *a,int &plc)
 30 {
 31     int root=0;
 32     int len=l;
 33     for(int i=1;i<=len;i++)
 34     {
 35         int c=a[i]-'A';
 36         if(!tr[root].ch[c])
 37             tr[root].ch[c]=++siz;
 38         root=tr[root].ch[c];
 39     }
 40     tr[root].fin=true;
 41     plc=root;
 42     return ;
 43 }
 44 void Build(void)
 45 {
 46     int root=0;
 47     for(int i=0;i<m;i++)
 48         if(tr[root].ch[i])
 49             Q.push(tr[root].ch[i]);
 50     while(!Q.empty())
 51     {
 52         root=Q.front();
 53         Q.pop();
 54         for(int i=0;i<m;i++)
 55         {
 56             if(tr[root].ch[i])
 57             {
 58                 tr[tr[root].ch[i]].fl=tr[tr[root].fl].ch[i];
 59                 Q.push(tr[root].ch[i]);
 60             }else
 61                 tr[root].ch[i]=tr[tr[root].fl].ch[i];
 62         }
 63     }
 64     return ;
 65 }
 66 int main()
 67 {
 68     scanf("%d%d%d",&n,&l,&m);
 69     for(int i=0;i<m;i++)
 70     {
 71         int a,b;
 72         scanf("%d%d",&a,&b);
 73         pre[i]=(double)(a)/(double)(b);
 74     }
 75     for(int i=1;i<=n;i++)
 76     {
 77         scanf("%s",tmp+1);
 78         Insert(tmp,ansp[i]);
 79     }
 80     Build();
 81     for(int i=0;i<=siz;i++)
 82     {
 83         if(tr[i].fin)
 84         {
 85             martix[i][i]=1.00;
 86             continue;
 87         }
 88         for(int j=0;j<m;j++)
 89             martix[i][tr[i].ch[j]]+=pre[j];
 90
 91     }
 92     int t=70;
 93     /*for(int i=0;i<=siz;i++)
 94     {
 95         for(int j=0;j<=siz;j++)
 96             printf("%.2lf ",martix[i][j]);
 97         puts("");
 98     }*/
 99     while(t--)
100     {
101         for(int i=0;i<=siz;i++)
102         {
103             for(int j=0;j<=siz;j++)
104             {
105                 temp[i][j]=0;
106                 for(int k=0;k<=siz;k++)
107                 {
108                     temp[i][j]+=martix[i][k]*martix[k][j];
109                 }
110             }
111         }
112         for(int i=0;i<=siz;i++)
113             for(int j=0;j<=siz;j++)
114                 martix[i][j]=temp[i][j];
115     }
116     for(int i=1;i<=n;i++)
117         printf("%.2lf\n",martix[0][ansp[i]]);
118     return 0;
119 }

转载于:https://www.cnblogs.com/blog-Dr-J/p/10014047.html

BZOJ1444: [Jsoi2009]有趣的游戏(Trie图,矩乘)相关推荐

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

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

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

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

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

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

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

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

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

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

  6. [JSOI2009]有趣的游戏

    题意 给你一个字符串集 构造一个串 S, S , S,每个位置你有 pi p i p_i的概率插入第 i i i个字符 问字符串集中每个字符串最先出现在构造的串中的概率 题解 涉及到字符串匹配首先想到 ...

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

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

  8. 教师计算机课游戏教学设计,《有趣的游戏》教学设计5篇

    <有趣的游戏>教学设计5篇 作为一名老师,时常需要编写教学设计,教学设计是一个系统化规划教学系统的过程.那么应当如何写教学设计呢?下面是小编为大家整理的<有趣的游戏>教学设计, ...

  9. 次世代游戏贴图的概念和制作

    http://blog.sina.com.cn/s/blog_6a36c6860100lm2f.html 导言: 本教程详细的介绍了次世代游戏贴图的概念,对实际生产中的一些制作要点进行了分析,对游戏制 ...

最新文章

  1. SQL server 行转列 列转行
  2. 数据结构(c语言版)笔记6,2020考研计算机《数据结构(C语言版)》复习笔记(6)
  3. 九大技巧教你快速提升移动应用登陆转化率
  4. iframe显示错误页面
  5. 织梦dedecms转WordPress方法(脚本一键转换)
  6. ucc编译器(语义分析)
  7. IDC:2016年第四季度全球企业存储市场出现下滑
  8. 通过代码控制ArcGIS Server的服务
  9. 一文详解双目视觉目标检测
  10. 国家制图标准适用于手工制图和计算机制图,机械制图国家标准与计算机绘图
  11. 笔记:WPS关于设置页眉页脚的问题
  12. 非线性数学模型线性化
  13. 掉头发厉害,是为什么呢?
  14. 从零开始学springboot笔记(一)-Spring boot之Hello Word
  15. 使用Python批量实现某一Excel文件中每3行数据存一个Excel文件
  16. 2023软考中级《软件设计师》(备考冲刺版) | 知识产权与标准化
  17. IntelliJ IDEA 2018.2 x64激活
  18. 拼多多店铺怎么做咨询
  19. c语言nba球星信息系统,NBA:超神控卫
  20. 我是如何放弃投行回归技术的

热门文章

  1. addActionListener(this)
  2. Nginx独立图片服务器搭建教程
  3. Python 缩进问题-inconsistent use of tabs and spaces in indentation.原因及解决方法
  4. 在Matlab中使用mex函数进行C/C++混合编程
  5. 埃尔米特插值(等距节点,只用一个点的导数构造n+1阶Hermite多项式)Python实现
  6. QT,C++最好的调试工具(抽象定义上的工具)
  7. 卷机神经网络的可视化(可视化中间激活)
  8. 常见的原生javascript DOM操作
  9. Angular26 ng-content和ng-container、投影的使用
  10. linux ssh免密登陆远程服务器