UVA 11468 AC 自动机
首先我们应该是枚举 L个位置上的每个字符来得到最终概率
然后AC自动机的作用就是为了判断你枚举的地方是否对应了单词节点,如果对应了,就肯定要不得
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int max_node = ;
const int N =;
const int node_num=;
int idx[N],k,n;
char str[][];
double prob[]; //这个地方一开始开小了,题目也没说n为多少。坑啊。。一直RE没找到原因
int vis[max_node][];
double d[max_node][];
struct ACtrie
{
int ch[max_node][];
int sz;
int val[max_node];
int fail[max_node];
//int last[max_node];
void init(){
memset(ch,,sizeof ch);
memset(val,,sizeof val);
memset(fail,,sizeof fail);
//memset(last,0,sizeof last);
sz=;
}
void insert(char* s,int v){
int u=;
for (int i=;s[i];i++){
int c=idx[s[i]];
if (!ch[u][c]){
memset(ch[sz],,sizeof ch[sz]);
val[sz]=;
ch[u][c]=sz++;
}
u=ch[u][c];
}
val[u]=;
}
void getfail(){
queue<int> q;
fail[]=;
for (int i=;i<node_num;i++)
if (ch[][i]){
fail[ch[][i]]=;
q.push(ch[][i]);
} while (!q.empty()){
int u=q.front();
q.pop();
for (int c=;c<node_num;c++){
int v=ch[u][c];
if (!v) {ch[u][c] = ch[fail[u]][c];continue;} //这个个普通AC自动机不一样,因为要一视同仁所有字符,当前字符在该子树如果找不到就可以转到其失败节点去,因为失败节点有的话,同样是满足条件的
q.push(v);
int p=fail[u];
while (p && !ch[p][c]) p=fail[p];
fail[v]=ch[p][c];
//last[v]=val[fail[p]]?fail[p] : last[fail[p]];
val[v]|=val[fail[v]];
}
}
}
} T;
double getprob(int u,int L)
{
if (L==) return 1.0;
if (vis[u][L]) return d[u][L];
vis[u][L]=;
d[u][L]=0.0;
for (int i=;i<n;i++){
if (!T.val[T.ch[u][i]]) d[u][L]+=prob[i]*getprob(T.ch[u][i],L-);
}
return d[u][L];
}
int main()
{
int t,L;
char cc[];
scanf("%d",&t);
int kase=;
while (t--){
T.init();
scanf("%d",&k);
for (int i=;i<k;i++)
scanf("%s",str[i]);
scanf("%d",&n);
for (int i=;i<n;i++){
scanf("%s%lf",&cc,&prob[i]);
idx[cc[]]=i;
}
for (int i=;i<k;i++){
T.insert(str[i],);
}
T.getfail();
memset(vis,,sizeof vis);
scanf("%d",&L);
double ans=getprob(,L);
printf("Case #%d: %.6lf\n",++kase,ans);
}
return ;
}
UVA 11468 AC 自动机的更多相关文章
- Uva 11468 AC自动机或运算
AC自动机 UVa 11468 题意:给一些字符和各自出现的概率,在其中随机选择L次,形成长度为L的字符串S,给定K个模板串,求S不包含任意一个串的概率. 首先介绍改良版的AC自动机: 传统的AC自动 ...
- UVa 11468 (AC自动机 概率DP) Substring
将K个模板串构成一个AC自动机,那些能匹配到的单词节点都称之为禁止节点. 然后问题就变成了在Tire树上走L步且不经过禁止节点的概率. 根据全概率公式用记忆化搜索求解. #include <cs ...
- UVA - 11468 (AC自动机+动态规划)
建立AC自动机,把AC自动机当做一张图,在上面跑L个节点就行了. 参考了刘汝佳的代码,发现可能有一个潜在的Bug--如果模式串中出现了没有指定的字符,AC自动机可能会建立出错. 提供一组关于这个BUG ...
- Substring UVA - 11468 AC自动机+概率DP
题意: 给出一些字符和各自对应的选择概率,随机选择L次后得到一个长度为L的随机字符串S. 给出K个模板串,计算S不包含任何一个模板串的概率 dp[i][j]表示走到AC自动机 i 这个节点 还需要走 ...
- UVA 11468 AC自动机入门题 记忆化概率dp+ac自动机
/** 链接:https://vjudge.net/problem/UVA-11468 详见lrj训练指南P218 我的是反向求存在模板串的概率. dp[i][j]表示当前i位置选择字符,前面i-1个 ...
- uva 11468 AC自动机+概率DP
#include<cstdio> #include<cstring> #include<queue> #include<cstdio> #include ...
- UVa 11019 (AC自动机 二维模式串匹配) Matrix Matcher
就向书上说得那样,如果模式串P的第i行出现在文本串T的第r行第c列,则cnt[r-i][c]++; 还有个很棘手的问题就是模式串中可能会有相同的串,所以用repr[i]来记录第i个模式串P[i]第一次 ...
- AC自动机——Uva 11468 子串
题目链接:http://vjudge.net/contest/142513#problem/A 题意:给出一些字符和各自对应的选择概率,随机选择L次后将得到一个长度为L的随机字符串S.给出K个模版串, ...
- 沉迷AC自动机无法自拔之:[UVA 11468] Substring
图片加载可能有点慢,请跳过题面先看题解,谢谢 这个鬼题目,上一波套路好了 先用题目给的模板串建\(AC\)自动机,把单词结尾标记为 \(val=1\),然后在建好的\(AC\)自动机上跑 \(dp\) ...
随机推荐
- 课程报名 | 基于模型训练平台快速打造 AI 能力
我们常说的 AI 通用能力往往不针对具体的行业应用,而是主要解决日常或者泛化的问题,很多技术企业给出的方案是通用式的,比如通用文字识别,无论识别身份证.驾驶证.行驶证等,任何一张图片训练后的模型都会尽 ...
- Golang的环境安装
Golang的环境安装 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Go语言环境安装 1>.下载Golang的安装包 博主推荐阅读: https://studygola ...
- netty权威指南学习笔记八——编解码技术之JBoss Marshalling
JBoss Marshalling 是一个java序列化包,对JDK默认的序列化框架进行了优化,但又保持跟java.io.Serializable接口的兼容,同时增加了一些可调参数和附加特性,这些参数 ...
- 超低功耗2.4G收发一体: SI24R1
Si24R1是一颗工作在2.4GHz ISM频段,专为低功耗无线场合设计,集成嵌入式ARQ基带协议引擎的无线收发器芯片.工作频率范围为2400MHz-2525MHz,共有126个1MHz带宽的信道.同 ...
- REST接口
全名是Representational State Transfer REST是设计风格而不是标准 建议将JSON格式作为标准响应格式 -------------------------------- ...
- redis以服务模式开机启动
第一步 修改redis为后台启动 vim /usr/redis/redis.conf #路径根据实际情况决定 # By default Redis does not run as a daemon. ...
- 本地Redis服务配置
本地Redis服务配置 要求:在虚拟机中启动redis服务,并要在windows物理机上取得链接 虚拟机安装略,(结果如下) windows工作机上装了Oracle VM VirtualBox,并在其 ...
- Python MySQL 删除表
章节 Python MySQL 入门 Python MySQL 创建数据库 Python MySQL 创建表 Python MySQL 插入表 Python MySQL Select Python M ...
- ROS2学习日志:TurtleSim测试日志(基于ROS2 Eloquent Elusor)
TurtleSim测试日志(基于ROS2 Eloquent Elusor) 1.ros2 run 1.1 ros2 run turtlesim turtlesim_node --ros-args -- ...
- html语一化/块/行级元素
html文件不区分大小写.//vue项目中组件名字驼峰 使用时候却全部小写 说明不区分 html语义化的意思, 就是标签名带有一定含义和一些css样式.比如h1-h6是标题 自动放大变粗,img是图片 ...