UVA - 11468:Substring
随机生成一个字符可以看成在AC自动机里面向前走一个节点,那么ans就是0向前走L步并且不经过单词节点,
由概率知识可得,f[p][L]=∑f[nxt[p][i]][L-1]*g[i] 其中p表示位于p节点,还要走L步,边界是f[p][0]=1.0,可以用记忆化搜索
非常巧妙的做法
- #include<cstdio>
- #include<cstdlib>
- #include<algorithm>
- #include<cstring>
- #include<queue>
- #define MAXN 25*25+10
- using namespace std;
- struct AC{
- int nxt[MAXN][];
- int f[MAXN];
- int match[MAXN];
- int m;
- char ch[];
- double g[];
- int cnt;
- int vis[MAXN][MAXN];
- double ans[MAXN][MAXN];
- void init(){
- memset(vis,,sizeof(vis));
- memset(nxt,,sizeof(nxt));
- memset(f,,sizeof(f));
- memset(match,,sizeof(match));
- cnt=;
- }
- int dex(char c){
- if('a'<=c&&c<='z')return c-;
- if('A'<=c&&c<='Z')return c-+;
- return c-+;
- }
- void insert(char s[]){
- int p=;
- int len=strlen(s);
- for(int i=;i<len;i++){
- int t=dex(s[i]);
- if(!nxt[p][t]){
- nxt[p][t]=(++cnt);
- }
- p=nxt[p][t];
- }
- match[p]=;
- }
- double work(int p,int L){
- if(!L)return 1.0;
- if(vis[p][L])return ans[p][L];
- vis[p][L]=;
- double &ret=ans[p][L];
- ret=0.0;
- for(int i=;i<=m;i++){
- int t=dex(ch[i]);
- if(!match[nxt[p][t]]){
- ret+=g[i]*work(nxt[p][t],L-);
- }
- }
- return ret;
- }
- void getFail(){
- queue<int> q;
- for(int i=;i<;i++){
- if(nxt[][i]){
- q.push(nxt[][i]);
- }
- }
- while(!q.empty()){
- int x=q.front();q.pop();
- for(int i=;i<;i++){
- int y=nxt[x][i];
- if(!y){nxt[x][i]=nxt[f[x]][i];continue;}
- f[y]=nxt[f[x]][i];
- match[y]|=match[f[y]];
- q.push(y);
- }
- }
- }
- }A;
- int n,m,L;
- char s[];
- void solve(){
- A.init();
- scanf("%d",&n);
- for(int i=;i<=n;i++){
- scanf("%s",s);
- A.insert(s);
- }
- A.getFail();
- scanf("%d",&m);
- A.m=m;
- for(int i=;i<=m;i++){
- double t;
- scanf("%s%lf",s,&t);
- A.ch[i]=s[];
- A.g[i]=t;
- }
- scanf("%d",&L);
- printf("%.6f\n",A.work(,L));
- }
- int main()
- {
- // freopen("data.in","r",stdin);
- int T;
- scanf("%d",&T);
- for(int i=;i<=T;i++){
- printf("Case #%d: ",i);
- solve();
- }
- return ;
- }
UVA - 11468:Substring的更多相关文章
- uva 11468 - Substring(AC自己主动机+概率)
题目链接:uva 11468 - Substring 题目大意:给出一些字符和各自字符相应的选择概率.随机选择L次后得到一个长度为L的字符串,要求该字符串不包括随意一个子串的概率. 解题思路:构造AC ...
- Uva 11468 AC自动机或运算
AC自动机 UVa 11468 题意:给一些字符和各自出现的概率,在其中随机选择L次,形成长度为L的字符串S,给定K个模板串,求S不包含任意一个串的概率. 首先介绍改良版的AC自动机: 传统的AC自动 ...
- SQL函数学习(一):substring()函数
秒懂例子: substring('98765',-1,3) 结果:9 substring('98765',0,3) 结果:98 substring('98765',1,3) 结果:987 在操作sql ...
- 沉迷AC自动机无法自拔之:[UVA 11468] Substring
图片加载可能有点慢,请跳过题面先看题解,谢谢 这个鬼题目,上一波套路好了 先用题目给的模板串建\(AC\)自动机,把单词结尾标记为 \(val=1\),然后在建好的\(AC\)自动机上跑 \(dp\) ...
- AC自动机+全概率+记忆化DP UVA 11468 Substring
题目传送门 题意:训练指南P217 分析:没有模板串也就是在自动机上走L步,不走到val[u] == v的节点的概率 PS:边读边insert WA了,有毒啊! #include <bits/s ...
- uva 11468 Substring
题意:给你 k 个模板串,然后给你一些字符的出现概率,然后给你一个长度 l ,问你这些字符组成的长度为 l 的字符串不包含任何一个模板串的概率. 思路:AC自动机+概论DP 首先用K个模板构造好AC自 ...
- UVa 11468 Substring (AC自动机+概率DP)
题意:给出一个字母表以及每个字母出现的概率.再给出一些模板串S.从字母表中每次随机拿出一个字母,一共拿L次组成一个产度为L的串, 问这个串不包含S中任何一个串的概率为多少? 析:先构造一个AC自动机, ...
- UVA 11468 Substring (记忆化搜索 + AC自动鸡)
传送门 题意: 给你K个模式串, 然后,再给你 n 个字符, 和它们出现的概率 p[ i ], 模式串肯定由给定的字符组成. 且所有字符,要么是数字,要么是大小写字母. 问你生成一个长度为L的串,不包 ...
- Substring UVA - 11468 AC自动机+概率DP
题意: 给出一些字符和各自对应的选择概率,随机选择L次后得到一个长度为L的随机字符串S. 给出K个模板串,计算S不包含任何一个模板串的概率 dp[i][j]表示走到AC自动机 i 这个节点 还需要走 ...
随机推荐
- Beta冲刺计划---Day0
Beta阶段报告---Day0 1.需要改进完善的功能 我们上一阶段开发由于开发时间匆忙,对于爬虫耗时的优化没有考虑.优化的空间我在Alpha阶段的总结报告里说过,具体看下图. 这张图显示出爱 ...
- ios swift例子源码网址总结
http://blog.csdn.net/woaifen3344/article/details/40079351 http://www.ruanman.net/swift/learn/4607.ht ...
- 单向链表在O(1)时间内删除一个节点
说删链表节点,第一时间想到就是遍历整个链表,找到删除节点的前驱,改变节点指向,删除节点,但是,这样删除单链表的某一节点,时间复杂度就是O(n),不符合要求: 时间复杂度是O(n)的做法就不说了,看看O ...
- Ubuntu下tomcat或eclipse启动提示没有java环境问题
tomcat和eclipse默认使用了openjdk,通过压缩包安装的jdk无法被识别,通过修改tomcat/bin下的catalina.sh添加jdk和jre路径即可 sudo gedit cata ...
- 在Eclipse中调用Algs4库
首先下载Eclipse,我选择的是Eclipse IDE for Java Developers64位版本,下载下来之后解压缩到喜欢的位置然后双击Eclipse.exe启动 然后开始新建项目,File ...
- js 中bind
function fn(a){ this.innerHTML = a; console.log(this); } //fn("hello"); span1.onclick =fun ...
- Win7下安装composer, 并使用其安装smarty
安装composer需要开启PHP openssl扩展. 1) 先查看PHP是否开启了openssl扩展 键盘win+r 输出cmd, 可以看到Dos窗口, 然后执行php -m (需要添加PHP环境 ...
- 深度学习之 cnn 进行 CIFAR10 分类
深度学习之 cnn 进行 CIFAR10 分类 import torchvision as tv import torchvision.transforms as transforms from to ...
- VS 2008 开发WinCE程序 编译部署速度慢的解决办法
1.找到以下文件 C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.CompactFramework.Common.targets 2.用记事本打开该 ...
- python全栈开发-常用模块的一些应用
一.random模块详解 1.概述 首先我们看到这个单词是随机的意思,他在python中的主要用于一些随机数,或者需要写一些随机数的代码,下面我们就来整理他的一些用法 2.常用方法 1. random ...