这题由于是一个单词,其实直接kmp+dp也无妨。建立自动机当然也是可以的。设dp[i][j]表示匹配到第i个字母的时候,在单词中处于第j个位置的概率,因此最终的答案是dp[0~m][len],m是输入的长度,len是单词的长度。转移方程见代码,即在一个节点的位置时,枚举下一步的走法,乘以这种走法的概率即是对下一个状态的概率贡献。

  其实自动机的fail指针跳转的位置即是kmp中nxt数组跳转的位置。

  代码如下:

  1. {
  2. while(j && word[j+] != word[i]) j = nxt[j];
  3. if(word[j+] == word[i]) j++;
  4. nxt[i] = j;
  5. }
  6. }
  7.  
  8. int main()
  9. {
  10. while(scanf("%d%d",&n,&m) == )
  11. {
  12. if(n== && m==) break;
  13. char s[];
  14. for(int i=;i<=n;i++)
  15. {
  16. scanf("%s%lf",s,p+i);
  17. c[i] = s[];
  18. }
  19. scanf("%s",word+);
  20. len = strlen(word+);
  21. get_nxt();
  22. memset(dp,,sizeof dp);
  23. dp[][] = 1.0;
  24. for(int i=;i<m;i++)
  25. {
  26. for(int j=;j<len;j++)
  27. {
  28. for(int k=;k<=n;k++)
  29. {
  30. int pos = j;
  31. while(pos && word[pos+] != c[k]) pos = nxt[pos];
  32. if(word[pos+] == c[k]) pos++;
  33. dp[i+][pos] += dp[i][j] * p[k];
  34. }
  35. }
  36. }
  37. double ans = 0.0;
  38. for(int i=;i<=m;i++) ans += dp[i][len];
  39. printf("%.2f%%\n",ans*100.0);
  40. }
  41. return ;
  42. }

kmp+dp

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int MAX_Tot = + ;
  4.  
  5. int n,m,len;
  6. double p[];
  7. char word[];
  8. int nxt[];
  9. double dp[][];
  10.  
  11. struct Aho
  12. {
  13. struct state
  14. {
  15. int nxt[];
  16. int fail,cnt;
  17. }stateTable[MAX_Tot];
  18.  
  19. int size;
  20.  
  21. queue<int> que;
  22.  
  23. void init()
  24. {
  25. while(que.size()) que.pop();
  26. for(int i=;i<MAX_Tot;i++)
  27. {
  28. memset(stateTable[i].nxt,,sizeof(stateTable[i].nxt));
  29. stateTable[i].fail = stateTable[i].cnt = ;
  30. }
  31. size = ;
  32. }
  33.  
  34. void insert(char *s)
  35. {
  36. int n = strlen(s);
  37. int now = ;
  38. for(int i=;i<n;i++)
  39. {
  40. char c = s[i];
  41. if(!stateTable[now].nxt[c-'a'])
  42. stateTable[now].nxt[c-'a'] = size++;
  43. now = stateTable[now].nxt[c-'a'];
  44. }
  45. stateTable[now].cnt++;
  46. }
  47.  
  48. void build()
  49. {
  50. stateTable[].fail = -;
  51. que.push();
  52.  
  53. while(que.size())
  54. {
  55. int u = que.front();que.pop();
  56. for(int i=;i<;i++)
  57. {
  58. if(stateTable[u].nxt[i])
  59. {
  60. if(u == ) stateTable[stateTable[u].nxt[i]].fail = ;
  61. else
  62. {
  63. int v = stateTable[u].fail;
  64. while(v != -)
  65. {
  66. if(stateTable[v].nxt[i])
  67. {
  68. stateTable[stateTable[u].nxt[i]].fail = stateTable[v].nxt[i];
  69. break;
  70. }
  71. v = stateTable[v].fail;
  72. }
  73. if(v == -) stateTable[stateTable[u].nxt[i]].fail = ;
  74. }
  75. que.push(stateTable[u].nxt[i]);
  76. }
  77. /*****建立自动机nxt指针*****/
  78. else
  79. {
  80. if(u == ) stateTable[u].nxt[i] = ;
  81. else
  82. {
  83. int p = stateTable[u].fail;
  84. while(p != - && stateTable[p].nxt[i] == ) p = stateTable[p].fail;
  85. if(p == -) stateTable[u].nxt[i] = ;
  86. else stateTable[u].nxt[i] = stateTable[p].nxt[i];
  87. }
  88. }
  89. /*****建立自动机nxt指针*****/
  90. }
  91. }
  92. }
  93. }aho;
  94.  
  95. int main()
  96. {
  97. while(scanf("%d%d",&n,&m) == )
  98. {
  99. if(n== && m==) break;
  100. aho.init();
  101. char s[];
  102. memset(p,,sizeof p);
  103. for(int i=;i<=n;i++)
  104. {
  105. double t;
  106. scanf("%s%lf",s,&t);
  107. p[s[]-'a'] = t;
  108. }
  109. scanf("%s",word+);
  110. aho.insert(word+); aho.build();
  111. memset(dp,,sizeof dp);
  112. dp[][] = 1.0;
  113. int sz = aho.size-;
  114. for(int i=;i<m;i++)
  115. {
  116. for(int j=;j<sz;j++)
  117. {
  118. for(int k=;k<;k++)
  119. {
  120. int v = aho.stateTable[j].nxt[k];
  121. dp[i+][v] += dp[i][j] * p[k];
  122. }
  123. }
  124. }
  125. double ans = 0.0;
  126. for(int i=;i<=m;i++) ans += dp[i][sz];
  127. printf("%.2f%%\n",ans*100.0);
  128. }
  129. return ;
  130. }

自动机+dp

HDU 3689 Infinite monkey theorem ——(自动机+DP)的更多相关文章

  1. HDU 3689 Infinite monkey theorem(DP+trie+自动机)(2010 Asia Hangzhou Regional Contest)

    Description Could you imaging a monkey writing computer programs? Surely monkeys are smart among ani ...

  2. HDU 3689 Infinite monkey theorem [KMP DP]

    Infinite monkey theorem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...

  3. hdu 3689 Infinite monkey theorem

    Infinite monkey theorem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  4. [HDU 3689]Infinite monkey theorem (KMP+概率DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3689 黄老师说得对,题目只有做wa了才会有收获,才会有提高. 题意:一个猴子敲键盘,键盘上有n个键,猴 ...

  5. [AC自己主动机+可能性dp] hdu 3689 Infinite monkey theorem

    意甲冠军: 给n快报,和m频率. 然后进入n字母出现的概率 然后给目标字符串str 然后问m概率倍的目标字符串是敲数量. 思维: AC自己主动机+可能性dp简单的问题. 首先建立trie图,然后就是状 ...

  6. ●HDU 3689 Infinite monkey theorem

    题链: http://acm.hdu.edu.cn/showproblem.php?pid=3689题解: KMP,概率dp (字符串都从1位置开始) 首先对模式串S建立next数组. 定义dp[i] ...

  7. hdu 3689 杭州 10 现场 J - Infinite monkey theorem 概率dp kmp 难度:1

    J - Infinite monkey theorem Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d &am ...

  8. hdu-3689 Infinite monkey theorem 概率dp+kmp

    有一只猴子随机敲键盘,给出它可能敲的键以及敲各个键的概率. 输入:n,表示有多少个键,m,表示猴子会敲m次键 n个二元组(字母,数字) 表示键代表的字母及其被敲的概率. 最后一个目标字符串. 问这只猴 ...

  9. HUD3689 Infinite monkey theorem

    Infinite monkey theorem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

随机推荐

  1. 轻松搭建CAS 5.x系列(2)-搭建HTTPS的SSO SERVER端

    概要说明 CAS要求,必须使用HTTPS的服务,否则就只等实现登录,无法实现单点登录.科普下HTTPS,网站有HTTP和HTTPS两种协议.HTTP是浏览器到网站之间是明文传输,比如你输入帐号名和密码 ...

  2. regex 正则分割字符串

    string _content=adak.sjdkajskj爱25教:师的656教案时; string en=@"\.|56|25";//单个[asj]分别以a,s,j为分隔符. ...

  3. c++容易混淆知识点

    C ++令人困惑的知识点1 函数传递指针和传递引用之间的区别? 1 GT;指针定义可能未初始化,但引用不可能; 2 - ;引用只能与一个实体组合,指针可以与多个实体组合; 3 GT;加法和减法的含义是 ...

  4. JavaScript特点有哪些

    JavaScript特点有哪些 JavaScript 文字脚本语言是一种动态的.弱类型的.基于原型的语言,具有内置的支持类型.它的解释器被称为javascript引擎,是浏览器的一部分,广泛用于客户端 ...

  5. python 判断两个ip地址是否属于同一子网

    python 判断两个ip地址是否属于同一子网 """ 判断两个IP是否属于同一子网, 需要判断网络地址是否相同 网络地址:IP地址的二进制与子网掩码的二进制地址逻辑&q ...

  6. json-server

    json-server 一个前端模拟数据的本地化服务器 安装 npm install -g json-server 查看是否安装成功 json-server -v 新建一个文件夹 在文件夹中新建db. ...

  7. 《浏览器工作原理与实践》<07>变量提升:JavaScript代码是按顺序执行的吗?

    讲解完宏观视角下的浏览器后,从这篇文章开始,我们就进入下一个新的模块了,这里我会对 JavaScript 执行原理做深入介绍. 今天在该模块的第一篇文章,我们主要讲解执行上下文相关的内容.那为什么先讲 ...

  8. Matlab---绘图及其位置摆放

    Matlab---绘图及其位置摆放 [@WP@20180509] 一.绘图函数 (1)绘制二维图形 (1.1) plot( ) 函数的应用格式. 1,plot(x). 当x 为一向量时,以x 元素的值 ...

  9. 【转】GO语言map类型interface{}转换踩坑小记

    原文:https://www.az1314.cn/art/69 ------------------------------------------ mapA := make([string]inte ...

  10. sqlite3.OperationalError: no such table: account_user

    你可能是在项目中安装了多个app, 首先删除相关app的migration文件中的子文件 执行建表的时候使用: python manage.py makemigrations appname pyth ...