建立AC自动机,把AC自动机当做一张图,在上面跑L个节点就行了。

  参考了刘汝佳的代码,发现可能有一个潜在的Bug--如果模式串中出现了没有指定的字符,AC自动机可能会建立出错。

提供一组关于这个BUG的数据:

这组数据我觉得答案应该是1吧,无论如何组合'a'和'b'这两个字符,也无法得到模式串"ac"和"bd"!!

AC代码

#include <stdio.h>
#include <string.h>
#include <queue>
#include <map>
using namespace std; const int maxnode = * + ;
const int segma_size = + + ;
const int maxn = + + + ;
const int maxs = + ;
double prob[maxn];
int id[], n, k;
char s[maxs][maxs]; struct Aho{
int ch[maxnode][segma_size];
int f[maxnode];
int match[maxnode];
int sz; void init() {
sz = ;
memset(ch[], , sizeof(ch[]));
} void insert(char *s) {
int u = , n = strlen(s);
// try to fix bug
for(int i = ; i < n; i++) {
int c = id[s[i]];
if(c == -) return;
} for(int i = ; i < n; i++) {
int c = id[s[i]];
if(!ch[u][c]) {
memset(ch[sz], , sizeof(ch[sz]));
match[sz] = ;
ch[u][c] = sz++;
}
u = ch[u][c];
}
match[u] = ;
} void getFail() {
f[] = ;
queue<int> q;
for(int i = ; i < n; i++) {
int u = ch[][i];
if(u) { f[u] = ; q.push(u); }
} while(!q.empty()) {
int r = q.front(); q.pop();
for(int c = ; c < n; 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]];
}
}
} }ac; double d[maxnode][];
bool vis[maxnode][]; double solve(int u, int L) {
if(!L) return 1.0;
if(vis[u][L]) return d[u][L];
vis[u][L] = true;
double &ans = d[u][L];
ans = 0.0;
for(int c = ; c < n; c++) {
if(!ac.match[ac.ch[u][c]]) ans += prob[c] * solve(ac.ch[u][c], L-);
}
return ans;
} int main() {
int T, kase = ;
scanf("%d", &T);
while(T--) {
scanf("%d", &k);
for(int i = ; i < k; i++) {
scanf("%s", s[i]);
}
scanf("%d", &n);
char ch[];
memset(id, -, sizeof(id));
for(int i = ; i < n; i++) {
scanf("%s%lf", ch, &prob[i]);
id[ch[]] = i;
}
ac.init();
for(int i = ; i < k; i++) ac.insert(s[i]);
ac.getFail();
int L;
scanf("%d", &L);
memset(vis, , sizeof(vis));
printf("Case #%d: %.6f\n", kase++, solve(, L));
}
return ;
}

UVA - 11468 (AC自动机+动态规划)的更多相关文章

  1. Uva 11468 AC自动机或运算

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

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

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

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

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

  4. UVA 11468 AC 自动机

    首先我们应该是枚举 L个位置上的每个字符来得到最终概率 然后AC自动机的作用就是为了判断你枚举的地方是否对应了单词节点,如果对应了,就肯定要不得 #include <iostream> # ...

  5. UVA 11468 AC自动机入门题 记忆化概率dp+ac自动机

    /** 链接:https://vjudge.net/problem/UVA-11468 详见lrj训练指南P218 我的是反向求存在模板串的概率. dp[i][j]表示当前i位置选择字符,前面i-1个 ...

  6. uva 11468 AC自动机+概率DP

    #include<cstdio> #include<cstring> #include<queue> #include<cstdio> #include ...

  7. BZOJ1030 [JSOI2007]文本生成器 AC自动机 动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1030 题意概括 给出n个模式串,问长度为m的串中有多少个至少含有这n个模式串中的任意一个. 注意, ...

  8. 【BZOJ1030】[JSOI2007]文本生成器 AC自动机+动态规划

    [BZOJ1030][JSOI2007]文本生成器 Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文 ...

  9. 视频游戏的连击 [USACO12JAN](AC自动机+动态规划)

    传送门 默认大家都学过trie与AC自动机. 先求出fail,对于每个节点维护一个sum,sum[u]待表从根到u所形成的字符串能拿到几分.显然sum[u]=sum[fail] + (u是几个字符串的 ...

随机推荐

  1. selenium操作浏览器cookies

    package test; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; imp ...

  2. 将分支推送到远程存储库时遇到错误: Git failed with a fatal error. TaskCanceledException encountered.

    解决:https://blog.csdn.net/dw33xn/article/details/79951714 修改下配置文件即可

  3. [py]python操作zookeeper

    参考: https://blog.csdn.net/heizistudio/article/details/79568188 1.安装zookeeper zookeeper-3.4.6.tar.gz ...

  4. Oracle创建新undo表空间最佳实践(包含段检查)

    在处理一则ORA-600 [4194]案例时,参考MOS文档:Step by step to resolve ORA-600 4194 4193 4197 on database crash (文档 ...

  5. (.NET高级课程笔记)委托、事件总结

      1.委托的声明.实例化和调用 同样的,也可以把事务写成上面的形式 2.泛型委托---Func.Action 3.委托的意义:解耦 4.委托的意义:异步多线程 5.委托的意义:多播委托 6.观察者模 ...

  6. 论文阅读(XiangBai——【PAMI2018】ASTER_An Attentional Scene Text Recognizer with Flexible Rectification )

    目录 XiangBai--[PAMI2018]ASTER_An Attentional Scene Text Recognizer with Flexible Rectification 作者和论文 ...

  7. Oracle创建表空间、表、一级用户授权

    ---恢复内容开始--- 1. 安装: 百度一下你就知道 2. sqlplus登录/sqlplus命令登录 在安装Oracle时,你需要记住设置的“全局数据库名”(默认为orcl) 和 口令,在以两种 ...

  8. cookiejar

    referer:https://www.cnblogs.com/why957/p/9297779.html文章介绍了四种模拟登陆方法 yield Request()可以将一个新的请求返回给爬虫执行 在 ...

  9. symfony command

    symfony 的command系统,有两部分构成:Application和command 1. Application是一个容器,负责对command进行管理. 2.command是每一个具体的命令 ...

  10. Python批量合并处理B站视频

    最近想学习后端,又不想花钱,怎么办呢?于是在手机端B站(哔哩哔哩)上面找到了满意的免费视频教程,但是手机端看起来很不方便啊.于是,我通过在手机端缓存下来后,导入到了电脑端,但是我后面了发现两个问题: ...