题目描述

输入

注意 是0<=P

输出

样例输入

样例输出


题解

AC自动机+矩阵乘法

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

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

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

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

#include <cstdio>
#include <cstring>
#include <queue>
#define N 12
#define M 110
using namespace std;
queue<int> q;
double p[N];
int pos[N] , next[M][N] , fail[M] , tag[M], tot = 1 , m;
char str[N];
struct data
{
double v[M][M];
data() {memset(v , 0 , sizeof(v));}
data operator*(const data a)const
{
data ans;
int i , j , k;
for(i = 1 ; i <= tot ; i ++ )
for(j = 1 ; j <= tot ; j ++ )
for(k = 1 ; k <= tot ; k ++ )
ans.v[i][j] += v[i][k] * a.v[k][j];
return ans;
}
}A;
void build()
{
int x , i;
for(i = 0 ; i < m ; i ++ ) next[0][i] = 1;
q.push(1);
while(!q.empty())
{
x = q.front() , q.pop();
for(i = 0 ; i < m ; i ++ )
{
if(next[x][i]) fail[next[x][i]] = next[fail[x]][i] , q.push(next[x][i]);
else next[x][i] = next[fail[x]][i];
}
}
}
int main()
{
int n , l , i , j , x , y;
scanf("%d%d%d" , &n , &l , &m);
for(i = 0 ; i < m ; i ++ ) scanf("%d%d" , &x , &y) , p[i] = (double)x / y;
for(i = 1 ; i <= n ; i ++ )
{
scanf("%s" , str + 1);
for(x = j = 1 ; j <= l ; j ++ )
{
if(!next[x][str[j] - 'A']) next[x][str[j] - 'A'] = ++tot;
x = next[x][str[j] - 'A'];
}
pos[i] = x , tag[x] = 1;
}
build();
for(i = 1 ; i <= tot ; i ++ )
{
if(tag[i]) A.v[i][i] = 1;
else for(j = 0 ; j < m ; j ++ ) A.v[i][next[i][j]] += p[j];
}
for(i = 1 ; i <= 50 ; i ++ ) A = A * A;
for(i = 1 ; i <= n ; i ++ ) printf("%.2lf\n" , A.v[1][pos[i]]);
return 0;
}

最新文章

  1. ******IT公司面试题汇总+优秀技术博客汇总
  2. 学习笔记:java并发编程学习之初识Concurrent
  3. LIstView 滚动 异步 加载更多 mono for android ScrollStateChanged ScrollState.Idle; Fling;TouchScroll
  4. MongoDB修改器的使用2
  5. 百度的echart环形图颜色动态设置
  6. [iOS 多线程 &amp; 网络 - 1.2] - 多线程GCD
  7. Apache HBase RPC身份验证中间人安全措施绕过漏洞(CVE-2013-2193)
  8. php总结 --- 19. 其他小知识
  9. jquery之onchange事件
  10. 输出特殊符号,可以用单引号&#39;引文&#39;:echo &#39;Hello World !&#39;
  11. Bag标签成一条线的代码来实现中国字
  12. 微信小程序--TabBar不出现的一种原因
  13. 一份完整的阿里云 Redis 开发规范,值得收藏!
  14. Java的多线程实现生产/消费模式
  15. SQL Server没有足够的内存继续执行程序 (mscorlib)的解决办法
  16. python全栈开发day80--评论楼、评论树
  17. 点击app分享链接,js判断手机是否安装某款app,有就尝试打开,没有就下载
  18. python练习题-day16
  19. hdoj4871
  20. opencv 霍夫变换 实现图片旋转角度计算

热门文章

  1. 【学习笔记】八:浏览器对象模型BOM
  2. Android Studio你必须学会的快捷键(Eclipse转AS必看)
  3. ABC3D创客项目:小风扇
  4. 霍金的新语音系统 ACAT 将开源
  5. 5 Options for Distributing Your iOS App to a Limited Audience
  6. 如何写好一个vue组件,老夫的一年经验全在这了【转】 v-bind=&quot;$attrs&quot; 和 v-on=&quot;$listeners&quot;
  7. python-DB模块
  8. 转义字符 &amp; sizeof &amp; strlen
  9. mongodb详细教程
  10. LeetCode 买卖股票的最佳时机 II