题目大意:给一些模板串,一些字符的出现概率。问不会出现模板串的概率是多少。

题目分析:是比较简单的概率DP+AC自动机。利用全概率公式递推即可。

代码如下:

  1. # include<iostream>
  2. # include<cstdio>
  3. # include<queue>
  4. # include<cstring>
  5. # include<algorithm>
  6. using namespace std;
  7.  
  8. const int N=1000;
  9.  
  10. int ch[N+5][65];
  11. int cnt;
  12. bool match[N+5];
  13. int f[N+5];
  14. char str[65][5];
  15. double pi[65];
  16. double dp[N+5][105];
  17. bool vis[N+5][105];
  18.  
  19. void init()
  20. {
  21. cnt=0;
  22. memset(pi,0,sizeof(pi));
  23. memset(ch,0,sizeof(ch));
  24. memset(match,false,sizeof(match));
  25. }
  26.  
  27. int idx(char c)
  28. {
  29. if(c>='0'&&c<='9') return c-'0';
  30. if(c>='a'&&c<='z') return c-'a'+10;
  31. return c-'A'+36;
  32. }
  33.  
  34. void insert(string s)
  35. {
  36. int n=s.size();
  37. int root=0;
  38. for(int i=0;i<n;++i){
  39. int c=idx(s[i]);
  40. if(!ch[root][c]) ch[root][c]=++cnt;
  41. root=ch[root][c];
  42. }
  43. match[root]=true;
  44. }
  45.  
  46. void getFail()
  47. {
  48. queue<int>q;
  49. f[0]=0;
  50. for(int i=0;i<62;++i){
  51. int u=ch[0][i];
  52. if(!u) continue;
  53. f[u]=0;
  54. q.push(u);
  55. }
  56. while(!q.empty())
  57. {
  58. int root=q.front();
  59. q.pop();
  60. for(int i=0;i<62;++i){
  61. int u=ch[root][i];
  62. if(!u){
  63. ch[root][i]=ch[f[root]][i];
  64. continue;
  65. }
  66. q.push(u);
  67. int v=f[root];
  68. while(v&&!ch[v][i]) v=f[v];
  69. f[u]=ch[v][i];
  70. match[u]|=match[f[u]];
  71. }
  72. }
  73. }
  74.  
  75. double dfs(int u,int L)
  76. {
  77. if(vis[u][L]) return dp[u][L];
  78. vis[u][L]=true;
  79. if(L==0) return dp[u][L]=1.0;
  80. double &ans=dp[u][L];
  81. ans=0.0;
  82. for(int i=0;i<62;++i) if(!match[ch[u][i]])
  83. ans+=pi[i]*dfs(ch[u][i],L-1);
  84. return ans;
  85. }
  86.  
  87. int main()
  88. {
  89. //freopen("in.txt","r",stdin);
  90. int T,n,m,L,cas=0;
  91. scanf("%d",&T);
  92. while(T--)
  93. {
  94. init();
  95. scanf("%d",&n);
  96. string p;
  97. for(int i=0;i<n;++i){
  98. cin>>p;
  99. insert(p);
  100. }
  101. getFail();
  102. scanf("%d",&m);
  103. double pp;
  104. for(int i=0;i<m;++i){
  105. scanf("%s%lf",str[i],&pp);
  106. pi[idx(str[i][0])]=pp;
  107. }
  108. scanf("%d",&L);
  109. memset(vis,false,sizeof(vis));
  110. printf("Case #%d: %.6lf\n",++cas,dfs(0,L));
  111. }
  112. return 0;
  113. }

  

UVA-11468 Substring(AC自动机+DP)的更多相关文章

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

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

  2. UVA 11468【AC自动机+DP】

    dp[i][j]表示走了i步走到j结点的概率.初始值dp[0][0] = 1.当走到的结点不是单词尾结点时,才能走过去. !end[i]&&last[i] == root时,该结点才可 ...

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

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

  4. Codeforces 1015F Bracket Substring AC自动机 + dp

    Bracket Substring 这么垃圾的题怎么以前都不会写啊, 现在一眼怎么就会啊.... 考虑dp[ i ][ j ][ k ][ op ] 表示 已经填了 i 个空格, 末尾串匹配到 所给串 ...

  5. POJ1625 Censored!(AC自动机+DP)

    题目问长度m不包含一些不文明单词的字符串有多少个. 依然是水水的AC自动机+DP..做完后发现居然和POJ2778是一道题,回过头来看都水水的... dp[i][j]表示长度i(在自动机转移i步)且后 ...

  6. HDU2296 Ring(AC自动机+DP)

    题目是给几个带有价值的单词.而一个字符串的价值是 各单词在它里面出现次数*单词价值 的和,问长度不超过n的最大价值的字符串是什么? 依然是入门的AC自动机+DP题..不一样的是这题要输出具体方案,加个 ...

  7. HDU2457 DNA repair(AC自动机+DP)

    题目一串DNA最少需要修改几个基因使其不包含一些致病DNA片段. 这道题应该是AC自动机+DP的入门题了,有POJ2778基础不难写出来. dp[i][j]表示原DNA前i位(在AC自动机上转移i步) ...

  8. hdu 4117 GRE Words AC自动机DP

    题目:给出n个串,问最多能够选出多少个串,使得前面串是后面串的子串(按照输入顺序) 分析: 其实这题是这题SPOJ 7758. Growing Strings AC自动机DP的进阶版本,主题思想差不多 ...

  9. hdu 2457(ac自动机+dp)

    题意:容易理解... 分析:这是一道比较简单的ac自动机+dp的题了,直接上代码. 代码实现: #include<stdio.h> #include<string.h> #in ...

  10. HDU 2425 DNA repair (AC自动机+DP)

    DNA repair Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

随机推荐

  1. Spring学习笔记之Bean的一些属性设置

    1.beans 里边配置default-init-method="shunge",有这个方法的会执行,没有也不会报错 2.beans 里边配置default-destroy-met ...

  2. dialog参数、方法以及事件

    参数(options) DOM方式初始化dialog的,推荐使用集合属性data-options定义参数,如果使用data属性定义参数,注意转换成对应的名称. 名称 类型 默认值 描述 id stri ...

  3. C# Inject

    using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Di ...

  4. (转)HTML文档头部信息

    原文:http://www.cnblogs.com/sunyunh/archive/2012/07/25/2609199.html HTML(3)HTML文档头部信息   <!DOCTYPE h ...

  5. (转)深入浅出 iOS 之生命周期

    原文:http://www.cocoachina.com/applenews/devnews/2011/0817/3129.html 深入浅出 iOS 之生命周期 发布于:2011-08-17 10: ...

  6. linux上安装mysql

    linux下mysql 最新版安装图解教程 1.查看当前安装的linux版本 命令:lsb_release -a 如下图所示 通过上图中的数据可以看出安装的版本为RedHat5.4,所以我们需要下载R ...

  7. (spring-第8回【IoC基础篇】)BeanDefinition在IoC容器中的注册

    在spring中,所有的bean都是由BeanFactory进行管理的.下面是BeanFactory的类体系结构: 我们清楚的看到,DefaultListableBeanFactory继承了BeanF ...

  8. BZOJ 2083 Intelligence test

    用vector,二分. #include<iostream> #include<cstdio> #include<cstring> #include<algo ...

  9. BZOJ 3450 Easy

    注意细节啊... 和上一道差不多. #include<iostream> #include<cstdio> #include<cstring> #include&l ...

  10. PHP Forms

    <html><body><form action="welcome.php" method="post">Name: < ...