沉迷AC自动机无法自拔之:[UVA 11468] Substring
图片加载可能有点慢,请跳过题面先看题解,谢谢



这个鬼题目,上一波套路好了
先用题目给的模板串建\(AC\)自动机,把单词结尾标记为 \(val=1\),然后在建好的\(AC\)自动机上跑 \(dp\),
设 \(f[x][L]\) 为:当前在 \(x\) 节点,剩下还要走 \(L\) 步并且不经过单词结尾的概率
那么有转移: \(f[x][L]=\sum_{!val[son[x][i]]}p[i]*dp(son[x][i],L-1)\),可以记忆搜实现
$
$
//made by Hero_of_someone
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define db double
#define il inline
using namespace std;
int T,t,n,m,L,id[150];
char s[25][25];
db p[65];
struct Tire{
int son[540][65],fail[540],size,root,val[540];
bool vis[540][110]; db f[510][110];
il void init(){
size=1; root=0;
memset(son,0,sizeof(son));
memset(val,0,sizeof(val));
memset(vis,0,sizeof(vis));
memset(fail,0,sizeof(fail));
}
il void insert(char *s){
int cur=root;
for(int i=0;s[i];i++){
int idx=id[s[i]];
if(!son[cur][idx]) son[cur][idx]=size++;
cur=son[cur][idx];
}
val[cur]=1; return ;
}
il void build(){
int que[1010],hd=0,tl=0;
for(int i=0;i<n;i++)
if(son[root][i]){
que[tl++]=son[root][i];
fail[son[root][i]]=root;
}
else son[root][i]=root;
while(hd<tl){
int cur=que[hd++];
for(int i=0;i<n;i++){
int Son=son[cur][i];
if(Son){
int f=fail[cur];
while(f && !son[f][i]) f=fail[f];
fail[Son]=son[f][i];
val[Son]|=val[fail[Son]];
que[tl++]=Son;
}
else son[cur][i]=son[fail[cur]][i];
}
}
}
il db dfs(int x,int L){
if(!L) return 1.0;
if(vis[x][L]) return f[x][L];
vis[x][L]=1;
db ret=0.0;
for(int i=0;i<n;i++){
if(val[son[x][i]]) continue;
ret+=p[i]*dfs(son[x][i],L-1);
}
return f[x][L]=ret;
}
}AC;
il void init(){
AC.init();
scanf("%d",&m); for(int i=1;i<=m;i++) scanf("%s",s[i]);
scanf("%d",&n);
for(int i=0;i<n;i++){
char ss[10];
scanf("%s %lf",ss,&p[i]);
id[ss[0]]=i;
}
for(int i=1;i<=m;i++) AC.insert(s[i]);
}
il void work(){ AC.build(); scanf("%d",&L); printf("Case #%d: %.6lf\n",t,AC.dfs(0,L)); }
int main(){ scanf("%d",&T); for(t=1;t<=T;t++){ init(); work(); } return 0; }
沉迷AC自动机无法自拔之:[UVA 11468] Substring的更多相关文章
- 沉迷AC自动机无法自拔之:[BZOJ2434] [Noi2011] 阿狸的打字机
如标题所言,我已经沉迷于AC自动机无法自拔了... 这又是一道AC自动的题,红红火火恍恍惚惚 这题目做起来真舒服 简单概括一下:\(AC\)自动机\(fail\)树上树链剖分\(+\)树状数组 这种类 ...
- 沉迷AC自动机无法自拔之:穿越广场 square
如标题所言,我已经沉迷于AC自动机无法自拔了... 这又是一道AC自动的题,红红火火恍恍惚惚 穿越广场 [问题描述] L 国的仪仗队要穿越首都广场了.首都广场可以看做是一块 N*M 的矩形网格,仪仗队 ...
- 沉迷AC自动机无法自拔之:[UVALive 4126] Password Suspects
图片加载可能有点慢,请跳过题面先看题解,谢谢 一看到这么多模式串就非常兴奋,又是\(AC\)自动机 题目就是要求:经过 \(n\) 个节点,把所有单词都遍历一遍的方案数,和那道题差不多嘛 所以这样设: ...
- uva 11468 - Substring(AC自己主动机+概率)
题目链接:uva 11468 - Substring 题目大意:给出一些字符和各自字符相应的选择概率.随机选择L次后得到一个长度为L的字符串,要求该字符串不包括随意一个子串的概率. 解题思路:构造AC ...
- UVa 11468 Substring (AC自动机+概率DP)
题意:给出一个字母表以及每个字母出现的概率.再给出一些模板串S.从字母表中每次随机拿出一个字母,一共拿L次组成一个产度为L的串, 问这个串不包含S中任何一个串的概率为多少? 析:先构造一个AC自动机, ...
- UVA 11468 Substring (AC自动机)
用把失配边也加到正常边以后AC自动机,状态是长度递减的DAG,每次选一个不会匹配字符的转移. dp[u][L]表示当前在tire树上u结点长度还剩L时候不匹配的概率,根据全概率公式跑记忆化搜索. #i ...
- UVA 11468 Substring (记忆化搜索 + AC自动鸡)
传送门 题意: 给你K个模式串, 然后,再给你 n 个字符, 和它们出现的概率 p[ i ], 模式串肯定由给定的字符组成. 且所有字符,要么是数字,要么是大小写字母. 问你生成一个长度为L的串,不包 ...
- uva 11468 Substring
题意:给你 k 个模板串,然后给你一些字符的出现概率,然后给你一个长度 l ,问你这些字符组成的长度为 l 的字符串不包含任何一个模板串的概率. 思路:AC自动机+概论DP 首先用K个模板构造好AC自 ...
- AC自动机+全概率+记忆化DP UVA 11468 Substring
题目传送门 题意:训练指南P217 分析:没有模板串也就是在自动机上走L步,不走到val[u] == v的节点的概率 PS:边读边insert WA了,有毒啊! #include <bits/s ...
随机推荐
- 20155320《网络对抗》Exp4 恶意代码分析
20155320<网络对抗>Exp4 恶意代码分析 [系统运行监控] 使用schtasks指令监控系统运行 首先在C盘目录下建立一个netstatlog.bat文件(由于是系统盘,所以从别 ...
- [转]Linux 系统挂载数据盘
原文地址:http://blog.csdn.net/jeep_ouc/article/details/39289643 *Linux的云服务器数据盘未做分区和格式化,可以根据以下步骤进行分区以及格式化 ...
- flask+socketio+echarts3 服务器监控程序(基于后端数据推送)
本文地址:http://www.cnblogs.com/hhh5460/p/7397006.html 说明 以前的那个例子的思路是后端监控数据存入数据库:前端ajax定时查询数据库. 这几天在看web ...
- 在服务器运行一个jar包,不用时终止它
1.打成jar包后,输入命令 nohup java -jar floodlight.jar >log.txt >& &//nohup 不生成 nohup.out的方法noh ...
- Egret(白鹭引擎)——Egret+fairyGui 实战项目入门
前言 一行白鹭上青天 需求 最近,我们老板刷刷的为了省事,给美术减压(背景有点长,不说了). 美术出 fairygui,我需要在网页上看到实时操作,并且看到效果! 需求分析 这怕是要了我的狗命啊,但是 ...
- AngularJS + CoffeeScript 前端开发环境配置详解
AngularJS 号称 '第一框架' ('The first framework') 确实是名不虚传.由其从jQuery中完全转入AngularJS后就有无法离开他的感觉了.虽然AngularJS的 ...
- unity过场动画组件Timeline
Timeline是Unity2017版本中新加入的功能,可以非常方便的进行场景动画的创建和修改,包括物体.声音.粒子.动画.特效.自定义Playable以及子Timeline等多种资源进行整合,从而能 ...
- 前端常见算法面试题之 - 二维数组中的查找[JavaScript解法]
--------------------- 作者:吴潇雄 来源:CSDN 原文:https://blog.csdn.net/weixin_43439741/article/details/835118 ...
- 在Linux系统中安装caffe
学习深度学习已经很久了,但一直没有自己动手安装过caffe,因为工作需要,需要在linux系统中安装caffe,因此,在这里对安装过程进行记录. caffe配置起来比tensorflow更麻烦一些,我 ...
- 微软职位内部推荐-SW Engineer II for Azure Network
微软近期Open的职位: Software Engineer II The world is moving to cloud computing. Microsoft is betting Windo ...