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 这个节点 还需要走 ...
随机推荐
- 201621123050 《Java程序设计》第13周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 为你的系统增加网络功能(购物车.图书馆管理.斗地主等)-分组完成 为了让你的系统可以被多个用户通过网 ...
- 团队作业7——第二次项目冲刺(Beta版本计划及安排)
Beta版本冲刺 需要改进完善的功能 1.寻找BUG.并解决问题 2.界面的优化 下一阶段新增的功能' 1.个人信息头像上传 2.头像裁剪功能 需要改进的团队分工 1.之前产品的主要工作 ...
- maven(二)创建工程
创建动态Web工程打war包 File→new→Maven Project→勾上create a simple project→然后next> 然后会报一下的错 解决 创建jav ...
- signalR 消息推送
业务情景一:上传报表,上传excel.如果excel的数据量很大,上万条,上十万条数据,那么这个上传请求必然是个耗时请求.用户上传之后,很关心上传的进度和结果. 业务情景二:站内消息提醒,实时有效地接 ...
- 【bug清除】Surface Pro系列使用Drawboard PDF出现手写偏移、卡顿、延迟现象的解决方式
最近自己新买的New Surface Pro在使用Drawboard PDF时,出现了性能问题,即笔迹延迟偏移,卡顿的问题. 排查驱动问题之后,确认解决方案如下: 将Surface的电池调到性能模式, ...
- egg.js 的优缺点
egg.js 的优缺点 优点 所有的 web开发的点都考虑到了 agent 很有特色 文件夹规划到位 扩展能力优秀 缺点 最大的问题在于: 使用 loader 加载之后,失去了代码提示的能力 监控和运 ...
- python3 常用模块
一.time与datetime模块 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们 ...
- Python内置函数(49)——isinstance
英文文档: isinstance(object, classinfo) Return true if the object argument is an instance of the classin ...
- Mego开发文档 - 事务
事务 事务允许以原子方式处理多个数据库操作.如果事务已提交,则所有操作都已成功应用于数据库.如果事务回滚,则没有任何操作应用于数据库. 默认行为 默认情况下,如果数据库提供程序支持事务,则单次的提交操 ...
- 查找git ignore的追踪
前言 版本控制说简单也简单,说复杂也困难的多.作为开发者,最基础的版本管理和团队协作的功能必须掌握.而其他一些相关的信息也可以了解下.比如,这次就有同事遇到了问题. 遇到的问题 在windows下,往 ...