题目链接:http://vjudge.net/contest/142513#problem/A

题意:给出一些字符和各自对应的选择概率,随机选择L次后将得到一个长度为L的随机字符串S.给出K个模版串,计算S不包含任何一个串的概率.

分析:

在构造好的AC自动机里面,每随机生成一个字母,相当于在AC自动机中随机走一步。所有单词结点标记为禁止,本题就是从结点 0 走 l 步,不进入任何禁止结点的概率。

#include <bits/stdc++.h>
using namespace std;const int SIGMA_SIZE = 64;
const int MAXNODE = 500;int idx[256];
char s[30][30];
double prob[SIGMA_SIZE];
int n;struct AhoCorasickAutomata
{int ch[MAXNODE][SIGMA_SIZE];int f[MAXNODE];int match[MAXNODE];int sz;void init(){sz = 1;memset(ch[0],0,sizeof(ch[0]));}void insert(char *s){int u = 0,n = strlen(s);for(int i=0; i<n; i++){int c = idx[s[i]];if(!ch[u][c]){memset(ch[sz],0,sizeof(ch[sz]));match[sz] = 0;ch[u][c] = sz++;}u = ch[u][c];}match[u] = 1;}void getFail(){queue<int> q;f[0] = 0;for(int c=0; c<SIGMA_SIZE; c++){int u = ch[0][c];if(u){f[u] = 0;q.push(u);}}while(!q.empty()){int r = q.front();q.pop();for(int c=0; c<SIGMA_SIZE; c++){int u = ch[r][c];if(!u){ch[r][c]=ch[f[r]][c];continue;}q.push(u);int v = f[r];while(v&&!ch[v][c])v = f[v];f[u] = ch[v][c];match[u] |=match[f[u]];}}}
};AhoCorasickAutomata ac;double d[MAXNODE][105];
int vis[MAXNODE][105];double getProb(int u,int l)
{if(!l) return 1.0;if(vis[u][l]) return d[u][l];vis[u][l] = 1;double& ans = d[u][l];ans = 0.0;for(int i=0; i<n; i++){if(!ac.match[ac.ch[u][i]])ans += prob[i]*getProb(ac.ch[u][i],l-1);}return ans;
}int main()
{int T;scanf("%d",&T);for(int kase = 1; kase<=T; kase ++){int k,l;scanf("%d",&k);for(int i=0; i<k; i++)scanf("%s",s[i]);scanf("%d",&n);for(int i=0; i<n; i++){char ch[9];scanf("%s%lf",ch,&prob[i]);idx[ch[0]] = i;}ac.init();for(int i=0; i<k; i++)ac.insert(s[i]);ac.getFail();scanf("%d",&l);memset(vis,0,sizeof(vis));printf("Case #%d: %.6lf\n",kase,getProb(0,l));}return 0;
}

转载于:https://www.cnblogs.com/TreeDream/p/6087297.html

AC自动机——Uva 11468 子串相关推荐

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

    将K个模板串构成一个AC自动机,那些能匹配到的单词节点都称之为禁止节点. 然后问题就变成了在Tire树上走L步且不经过禁止节点的概率. 根据全概率公式用记忆化搜索求解. 1 #include < ...

  2. UVA 11468 Substring(AC自动机+dp)

    题意就是给你几个模板串,以及一些字符的出现概率,随机选择字符L次后得到一个长度为L的字符串,问这个字符串不包括任何一个模板串的概率. 比较简单的题,把模板串构建成AC自动机,随机选择字符相当于在字典树 ...

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

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

  4. AC自动机加强版 uva 1449 - Dominating Patterns

    AC自动机最初作用  一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过. 当然这不是AC自动机的全部作用. 本文就是一例,给出几个单词,查询在text里 ...

  5. ZOJ - 3228 Searching the String(AC自动机求不重复子串出现次数)

    题目链接:点击查看 题目大意:给出一个匹配串 str ,再给出 n 个长度不大于 6 的匹配串 s ,问每个匹配串出现的次数,分可以重复或不可以重复两种情况 题目分析:因为是匹配串在模式串中出现的次数 ...

  6. Aho-Corasick 多模式匹配算法(AC自动机) 的算法详解及具体实现

    多模式匹配 多模式匹配就是有多个模式串P1,P2,P3-,Pm,求出所有这些模式串在连续文本T1-.n中的所有可能出现的位置. 例如:求出模式集合{"nihao","ha ...

  7. 字符串匹配算法 -- AC自动机 基于Trie树的高效的敏感词过滤算法

    文章目录 1. 算法背景 2. AC自动机实现原理 2.1 构建失败指针 2.2 依赖失败指针过滤敏感词 3. 复杂度及完整代码 1. 算法背景 之前介绍过单模式串匹配的高效算法:BM和KMP 以及 ...

  8. 【Luogu3041】视频游戏的连击(AC自动机,动态规划)

    题面链接 题解 首先构建出AC自动机 然后在AC自动机上面跑DP 转移很显然从Trie树的节点跳到他的儿子节点 但是要注意一个问题, 在计算的时候,每一个节点加入后能够 造成的贡献 要加上他的子串的贡 ...

  9. 【AC自动机】【字符串】【字典树】AC自动机 学习笔记

    blog:www.wjyyy.top     AC自动机是一种毒瘤的方便的多模式串匹配算法.基于字典树,用到了类似KMP的思维.     AC自动机与KMP不同的是,AC自动机可以同时匹配多个模式串, ...

最新文章

  1. java 字符串xml,解析java中的xml字符串?
  2. 3.请执行命令取出linux中eth0的IP地址(考试题答案系列)
  3. 通过Scroller.js制作上拉加载和下拉刷新
  4. Example017简单的下拉框
  5. apache开启 gzip 压缩
  6. 【Paper】2003_Consensus Problems in Networks of Agents with Switching Topology and Time-Delays
  7. 【jQuery】使用id选择器,找出外层div中嵌套的内层div
  8. 中心对称又是轴对称的图形_2020广东省考行测备考:图形推理之对称知多少
  9. C++11多线程创建的三种方法
  10. 工作记录 反射
  11. H5 37-背景缩写
  12. PS图像特效算法——镜像渐隐
  13. CH582 BLE 5.0 使用 LE Coded 广播和连接
  14. 华为机试真题 C++ 实现【最短木板长度】【100%通过率】【2022.11 Q4 新题】
  15. 1994年颁布了计算机安全,1994年2月18日,我国颁布了( ),这是我国的第一个计算机安全法规,是我国计算机安全工作的总体纲领。...
  16. 阅读笔记--现代操作系统
  17. 关节空间阻抗控制器设计的个人理解
  18. bugku~图穷匕见
  19. nginx: [emerg] getpwnam(“nobody“) failed
  20. iOS---集成融云SDK即时通讯

热门文章

  1. LeetCode算法入门- Remove Duplicates from Sorted Array -day21
  2. 添加编译宏_软件开发——编译链接
  3. STM32-IO引脚复用-原理和使用
  4. server sql 水平分表_springboot集成Shardingsphere进行分库分表
  5. linux查看帮助文档的命令,Linux如何使用查看一个命令的帮助文档呢?
  6. python o创建文件_Python 文件I/O
  7. python 函数 过程_python学习之函数(三)--函数与过程
  8. java中的action是指什么_Struts2【开发Action】知识要点
  9. 命令行输入mysql不行_MySQL命令行无法插入中文数据
  10. Web前端期末大作业--响应式有氧健身休闲会所网页设计(HTML+CSS+JavaScript)