随机生成一个字符可以看成在AC自动机里面向前走一个节点,那么ans就是0向前走L步并且不经过单词节点,

由概率知识可得,f[p][L]=∑f[nxt[p][i]][L-1]*g[i] 其中p表示位于p节点,还要走L步,边界是f[p][0]=1.0,可以用记忆化搜索

非常巧妙的做法

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<queue>
  6. #define MAXN 25*25+10
  7. using namespace std;
  8. struct AC{
  9. int nxt[MAXN][];
  10. int f[MAXN];
  11. int match[MAXN];
  12. int m;
  13. char ch[];
  14. double g[];
  15. int cnt;
  16. int vis[MAXN][MAXN];
  17. double ans[MAXN][MAXN];
  18. void init(){
  19. memset(vis,,sizeof(vis));
  20. memset(nxt,,sizeof(nxt));
  21. memset(f,,sizeof(f));
  22. memset(match,,sizeof(match));
  23. cnt=;
  24. }
  25. int dex(char c){
  26. if('a'<=c&&c<='z')return c-;
  27. if('A'<=c&&c<='Z')return c-+;
  28. return c-+;
  29. }
  30. void insert(char s[]){
  31. int p=;
  32. int len=strlen(s);
  33. for(int i=;i<len;i++){
  34. int t=dex(s[i]);
  35. if(!nxt[p][t]){
  36. nxt[p][t]=(++cnt);
  37. }
  38. p=nxt[p][t];
  39. }
  40. match[p]=;
  41. }
  42. double work(int p,int L){
  43. if(!L)return 1.0;
  44. if(vis[p][L])return ans[p][L];
  45. vis[p][L]=;
  46. double &ret=ans[p][L];
  47. ret=0.0;
  48. for(int i=;i<=m;i++){
  49. int t=dex(ch[i]);
  50. if(!match[nxt[p][t]]){
  51. ret+=g[i]*work(nxt[p][t],L-);
  52. }
  53. }
  54. return ret;
  55. }
  56. void getFail(){
  57. queue<int> q;
  58. for(int i=;i<;i++){
  59. if(nxt[][i]){
  60. q.push(nxt[][i]);
  61. }
  62. }
  63. while(!q.empty()){
  64. int x=q.front();q.pop();
  65. for(int i=;i<;i++){
  66. int y=nxt[x][i];
  67. if(!y){nxt[x][i]=nxt[f[x]][i];continue;}
  68. f[y]=nxt[f[x]][i];
  69. match[y]|=match[f[y]];
  70. q.push(y);
  71. }
  72. }
  73. }
  74. }A;
  75. int n,m,L;
  76. char s[];
  77. void solve(){
  78. A.init();
  79. scanf("%d",&n);
  80. for(int i=;i<=n;i++){
  81. scanf("%s",s);
  82. A.insert(s);
  83. }
  84. A.getFail();
  85. scanf("%d",&m);
  86. A.m=m;
  87. for(int i=;i<=m;i++){
  88. double t;
  89. scanf("%s%lf",s,&t);
  90. A.ch[i]=s[];
  91. A.g[i]=t;
  92. }
  93. scanf("%d",&L);
  94. printf("%.6f\n",A.work(,L));
  95. }
  96. int main()
  97. {
  98. // freopen("data.in","r",stdin);
  99. int T;
  100. scanf("%d",&T);
  101. for(int i=;i<=T;i++){
  102. printf("Case #%d: ",i);
  103. solve();
  104. }
  105. return ;
  106. }

UVA - 11468:Substring的更多相关文章

  1. uva 11468 - Substring(AC自己主动机+概率)

    题目链接:uva 11468 - Substring 题目大意:给出一些字符和各自字符相应的选择概率.随机选择L次后得到一个长度为L的字符串,要求该字符串不包括随意一个子串的概率. 解题思路:构造AC ...

  2. Uva 11468 AC自动机或运算

    AC自动机 UVa 11468 题意:给一些字符和各自出现的概率,在其中随机选择L次,形成长度为L的字符串S,给定K个模板串,求S不包含任意一个串的概率. 首先介绍改良版的AC自动机: 传统的AC自动 ...

  3. SQL函数学习(一):substring()函数

    秒懂例子: substring('98765',-1,3) 结果:9 substring('98765',0,3) 结果:98 substring('98765',1,3) 结果:987 在操作sql ...

  4. 沉迷AC自动机无法自拔之:[UVA 11468] Substring

    图片加载可能有点慢,请跳过题面先看题解,谢谢 这个鬼题目,上一波套路好了 先用题目给的模板串建\(AC\)自动机,把单词结尾标记为 \(val=1\),然后在建好的\(AC\)自动机上跑 \(dp\) ...

  5. AC自动机+全概率+记忆化DP UVA 11468 Substring

    题目传送门 题意:训练指南P217 分析:没有模板串也就是在自动机上走L步,不走到val[u] == v的节点的概率 PS:边读边insert WA了,有毒啊! #include <bits/s ...

  6. uva 11468 Substring

    题意:给你 k 个模板串,然后给你一些字符的出现概率,然后给你一个长度 l ,问你这些字符组成的长度为 l 的字符串不包含任何一个模板串的概率. 思路:AC自动机+概论DP 首先用K个模板构造好AC自 ...

  7. UVa 11468 Substring (AC自动机+概率DP)

    题意:给出一个字母表以及每个字母出现的概率.再给出一些模板串S.从字母表中每次随机拿出一个字母,一共拿L次组成一个产度为L的串, 问这个串不包含S中任何一个串的概率为多少? 析:先构造一个AC自动机, ...

  8. UVA 11468 Substring (记忆化搜索 + AC自动鸡)

    传送门 题意: 给你K个模式串, 然后,再给你 n 个字符, 和它们出现的概率 p[ i ], 模式串肯定由给定的字符组成. 且所有字符,要么是数字,要么是大小写字母. 问你生成一个长度为L的串,不包 ...

  9. Substring UVA - 11468 AC自动机+概率DP

    题意: 给出一些字符和各自对应的选择概率,随机选择L次后得到一个长度为L的随机字符串S. 给出K个模板串,计算S不包含任何一个模板串的概率 dp[i][j]表示走到AC自动机 i 这个节点 还需要走 ...

随机推荐

  1. Beta冲刺计划---Day0

    Beta阶段报告---Day0 1.需要改进完善的功能   我们上一阶段开发由于开发时间匆忙,对于爬虫耗时的优化没有考虑.优化的空间我在Alpha阶段的总结报告里说过,具体看下图.   这张图显示出爱 ...

  2. ios swift例子源码网址总结

    http://blog.csdn.net/woaifen3344/article/details/40079351 http://www.ruanman.net/swift/learn/4607.ht ...

  3. 单向链表在O(1)时间内删除一个节点

    说删链表节点,第一时间想到就是遍历整个链表,找到删除节点的前驱,改变节点指向,删除节点,但是,这样删除单链表的某一节点,时间复杂度就是O(n),不符合要求: 时间复杂度是O(n)的做法就不说了,看看O ...

  4. Ubuntu下tomcat或eclipse启动提示没有java环境问题

    tomcat和eclipse默认使用了openjdk,通过压缩包安装的jdk无法被识别,通过修改tomcat/bin下的catalina.sh添加jdk和jre路径即可 sudo gedit cata ...

  5. 在Eclipse中调用Algs4库

    首先下载Eclipse,我选择的是Eclipse IDE for Java Developers64位版本,下载下来之后解压缩到喜欢的位置然后双击Eclipse.exe启动 然后开始新建项目,File ...

  6. js 中bind

    function fn(a){ this.innerHTML = a; console.log(this); } //fn("hello"); span1.onclick =fun ...

  7. Win7下安装composer, 并使用其安装smarty

    安装composer需要开启PHP openssl扩展. 1) 先查看PHP是否开启了openssl扩展 键盘win+r 输出cmd, 可以看到Dos窗口, 然后执行php -m (需要添加PHP环境 ...

  8. 深度学习之 cnn 进行 CIFAR10 分类

    深度学习之 cnn 进行 CIFAR10 分类 import torchvision as tv import torchvision.transforms as transforms from to ...

  9. VS 2008 开发WinCE程序 编译部署速度慢的解决办法

    1.找到以下文件 C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.CompactFramework.Common.targets 2.用记事本打开该 ...

  10. python全栈开发-常用模块的一些应用

    一.random模块详解 1.概述 首先我们看到这个单词是随机的意思,他在python中的主要用于一些随机数,或者需要写一些随机数的代码,下面我们就来整理他的一些用法 2.常用方法 1. random ...