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

建立AC自动机,把AC自动机当做一张图,在上面跑L个节点就行了. 参考了刘汝佳的代码,发现可能有一个潜在的Bug--如果模式串中出现了没有指定的字符,AC自动机可能会建立出错. 提供一组关于这个BUG的数据: 这组数据我觉得答案应该是1吧,无论如何组合'a'和'b'这两个字符,也无法得到模式串"ac"和"bd"!! AC代码 #include <stdio.h> #include <string.h> #include <queue&g…
AC自动机 UVa 11468 题意:给一些字符和各自出现的概率,在其中随机选择L次,形成长度为L的字符串S,给定K个模板串,求S不包含任意一个串的概率. 首先介绍改良版的AC自动机: 传统的AC自动机,是当一个字符失配时,根据失配函数转移到指定地方,而这个失配函数,是通过一个宽搜的过程形成的,这时在匹配串的时候,就当匹配失败时,顺着失配指针走,直到可以匹配.然后匹配到单词结点,或者后缀链接是一个单词结点,这些前面的结点也是匹配单词.这就是传统的AC自动机. 现在将这个AC自动机改版优化: 具体…
将K个模板串构成一个AC自动机,那些能匹配到的单词节点都称之为禁止节点. 然后问题就变成了在Tire树上走L步且不经过禁止节点的概率. 根据全概率公式用记忆化搜索求解. #include <cstdio> #include <cstring> #include <queue> using namespace std; ; ; ]; struct AhoCorasickAutomata { int ch[maxnode][sigma_size]; int match[ma…
题意: 给出一些字符和各自对应的选择概率,随机选择L次后得到一个长度为L的随机字符串S. 给出K个模板串,计算S不包含任何一个模板串的概率 dp[i][j]表示走到AC自动机 i 这个节点 还需要走 j 步的概率. 表示不会概率DP ,看网上题解写的. 通过记忆化搜索去写. 注意一点字符有大小字母和数字 #include <set> #include <map> #include <stack> #include <queue> #include <c…
首先我们应该是枚举 L个位置上的每个字符来得到最终概率 然后AC自动机的作用就是为了判断你枚举的地方是否对应了单词节点,如果对应了,就肯定要不得 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; ; ; ; int idx[N],k,n; ][]; ]; //这个地方…
/** 链接:https://vjudge.net/problem/UVA-11468 详见lrj训练指南P218 我的是反向求存在模板串的概率. dp[i][j]表示当前i位置选择字符,前面i-1个字符在自动机的匹配节点编号为j时候的状态可以获得的存在概率. 书上的好简洁,求idx(c)直接利用已经给定的n个字符的下标作为结果. 正向求解!厉害. */ #include<bits/stdc++.h> using namespace std; #define P pair<int,int…
#include<cstdio> #include<cstring> #include<queue> #include<cstdio> #include<map> #include<string> using namespace std; ; ; // 结点总数 + ; // 模板个数 ], n; double prob[SIGMA_SIZE]; struct AhoCorasickAutomata { int ch[MAXNODE]…
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1030 题意概括 给出n个模式串,问长度为m的串中有多少个至少含有这n个模式串中的任意一个. 注意,所有的串仅由A~Z 26个大写字母构成. 题解 AC自动机好题. 先构建一个AC自动机. 然后在AC自动机上面跑dp. 建议开滚动数组. dp[i][j]表示长度为i,在AC自动机上面走到了j的方案数. 每次把所有走到模式串尾的全动统计到答案并清零. 代码 #include <cstring> #…
[BZOJ1030][JSOI2007]文本生成器 Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固定且完全随机的文章—— 也就是说,生成的文章中每个字节都是完全随机的.如果一篇文章中至少包含使用者们了解的一个单词,那么我们说这篇文章是可读的(我们称文章a包含单词b,当且仅当单词b是文章a的子串).但是,即使按照这样的标准,使用者现…
传送门 默认大家都学过trie与AC自动机. 先求出fail,对于每个节点维护一个sum,sum[u]待表从根到u所形成的字符串能拿到几分.显然sum[u]=sum[fail] + (u是几个字符串的结尾). 设dp[i][j]代表长度为i到trie树上的j号节点所得的最大分数,显然有dp[i+1][j的字符k儿子] = max{dp[i+1][j的字符k儿子], dp[i][j] + sum[j的字符k儿子]} memset(dp, -, sizeof(dp)); dp[][] = ; ; i…