UVa 11468 (AC自动机 概率DP) Substring

将K个模板串构成一个AC自动机,那些能匹配到的单词节点都称之为禁止节点。

然后问题就变成了在Tire树上走L步且不经过禁止节点的概率。

根据全概率公式用记忆化搜索求解。

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <queue>
  4 using namespace std;
  5 
  6 const int maxnode = 500;
  7 const int sigma_size = 64;
  8 int idx[256];
  9 
 10 struct AhoCorasickAutomata
 11 {
 12     int ch[maxnode][sigma_size];
 13     int match[maxnode];
 14     int f[maxnode];
 15     int sz;
 16 
 17     void init() { sz = 1; memset(ch[0], 0, sizeof(ch[0])); }
 18 
 19     void insert(char* s)
 20     {
 21         int u = 0, n = strlen(s);
 22         for(int i = 0; i < n; i++)
 23         {
 24             int c = idx[s[i]];
 25             if(!ch[u][c])
 26             {
 27                 memset(ch[sz], 0, sizeof(ch[sz]));
 28                 match[sz] = 0;
 29                 ch[u][c] = sz++;
 30             }
 31             u = ch[u][c];
 32         }
 33         match[u] = 1;
 34     }
 35 
 36     void getFail()
 37     {
 38         queue<int> q;
 39         f[0] = 0;
 40         for(int c = 0; c < sigma_size; c++)
 41         {
 42             int u = ch[0][c];
 43             if(u) { f[u] = 0; q.push(u); }
 44         }
 45         while(!q.empty())
 46         {
 47             int r = q.front(); q.pop();
 48             for(int c = 0; c < sigma_size; c++)
 49             {
 50                 int u = ch[r][c];
 51                 if(!u) { ch[r][c] = ch[f[r]][c]; continue; }
 52                 q.push(u);
 53                 int v = f[r];
 54                 while(v && !ch[v][c]) v = f[v];
 55                 f[u] = ch[v][c];
 56                 match[u] |= match[f[u]];
 57             }
 58         }
 59     }
 60 }ac;
 61 
 62 int n;
 63 const int maxl = 100 + 10;
 64 char s[30][30];
 65 double prob[sigma_size];
 66 
 67 int vis[maxnode][maxl];
 68 double d[maxnode][maxl];
 69 
 70 double getProb(int u, int L)
 71 {
 72     if(L == 0) return 1.0;
 73     if(vis[u][L]) return d[u][L];
 74     vis[u][L] = 1;
 75     double& ans = d[u][L];
 76     ans = 0;
 77     for(int c = 0; c < n; c++)
 78         if(!ac.match[ac.ch[u][c]])
 79             ans += prob[c] * getProb(ac.ch[u][c], L-1);
 80     return ans;
 81 }
 82 
 83 int main()
 84 {
 85     //freopen("in.txt", "r", stdin);
 86 
 87     int T;
 88     scanf("%d", &T);
 89     for(int kase = 1; kase <= T; kase++)
 90     {
 91         int k, L;
 92         scanf("%d", &k);
 93         for(int i = 0; i < k; i++) scanf("%s", s[i]);
 94 
 95         scanf("%d", &n);
 96         for(int i = 0; i < n; i++)
 97         {
 98             char s1[9];
 99             scanf("%s%lf", s1, &prob[i]);
100             idx[s1[0]] = i;
101         }
102 
103         ac.init();
104         for(int i = 0; i < k; i++) ac.insert(s[i]);
105         ac.getFail();
106         scanf("%d", &L);
107         memset(vis, 0, sizeof(vis));
108         printf("Case #%d: %.6f\n", kase, getProb(0, L));
109     }
110 
111     return 0;
112 }
代码君

 

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/4394173.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376104.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css 伪元素分享!!!

最近接触到的css 伪元素觉得还算不错 分享下&#xff1a; 1、清楚内盒浮动设置&#xff1a; .back_list ul{padding:12px 0 0 12px;zoom:1;} .back_list ul:after{clear: both;content: ".";display: block;height: 0;visibility: hidden;}/*清楚内盒浮动设置*/ 2、伪…

蓝桥杯 花朵数

一个N位的十进制正整数&#xff0c;如果它的每个位上的数字的N次方的和等于这个数本身&#xff0c;则称其为花朵数。 例如&#xff1a; 当N3时&#xff0c;153就满足条件&#xff0c;因为 1^3 5^3 3^3 153&#xff0c;这样的数字也被称为水仙花数&#xff08;其中&#xff0…

ROC曲线【转】

ROC曲线&#xff08;Receiver Operating Characteeristic Curve&#xff09;是显示Classification模型真正率和假正率之间折中的一种图形化方法 解读ROC图的一些概念定义&#xff1a; 真正&#xff08;True Positive , TP&#xff09;被模型预测为正的正样本 假负&#xff08;F…

java eclipse oxygen_Eclipse Java Oxygen配置Tomcat

eclipse oxygen 配置tomcat 9.0第一步 装上eclipse的EE插件因为我以前学习java都是用eclipse oxygen的se版本&#xff0c;所以并不支持j2EE&#xff0c;所以第一步&#xff0c;就是要先把它升级为EE版本。有两种方法供我们选择。重新安装eclipse的EE版本。安装eclipse的EE插件。…

java 数组处理_JAVA操作数组

使用 Arrays 类操作 Java 中的数组Arrays 类是 Java 中提供的一个工具类&#xff0c;在 java.util 包中。该类中包含了一些方法用来直接操作数组&#xff0c;比如可直接实现数组的排序、搜索等Arrays 中常用的方法&#xff1a;1、 排序语法&#xff1a; Arrays.sort(数组名);可…

java拆装_JAVA线性表拆解

线性表(List)是一种线性结构。其特点是数据元素直线的线性关系。1.线性表抽象类定义public abstract class AbsList implements Iterable&#xff0c;List{protected int length;abstract public T get(int i); //返回第i(i≥0)个元素abstract public boolean set(int i, T x);…

【BZOJ】【1041】【HAOI2008】圆周上的点

数学 orz hzwer 完全不会做…… 很纠结啊&#xff0c;如果将来再遇到这种题&#xff0c;还是很难下手啊…… 引用题解&#xff1a; 【分析】&#xff1a; 样例图示&#xff1a; 首先,最暴力的算法显而易见&#xff1a;枚举x轴上的每个点&#xff0c;带入圆的方程&#xff0c;检…

【Android】配置APK开发环境

【Android】配置APK开发环境1.安装java jdk去oracle公司下载jdk-7u15-windows-i586.exehttp://www.oracle.com/technetwork/cn/java/javase/downloads/jdk7-downloads-1880260-zhs.html---C:\Documents and Settings\XXXX>java -versionjava version "1.7.0_15"Ja…

20135127陶俊杰 实验一

北京电子科技学院(BESTI) 《Java程序设计》课实验报告 班 级&#xff1a;201351 姓名及学号&#xff1a;陶俊杰 20135127 指导教师&#xff1a;娄佳鹏 必修/选修&#xff1a;选修 实验日期&#xff1a; 2015年4月16日 实验时间&…

Google Code Jam 2015 Round 1A Haircut 二分

题意&#xff1a;给你每个理发师的理发时间&#xff0c;问你排在队列中的第N个位置&#xff0c;问你应该被哪个理发师剪发。 解题思路&#xff1a;二分时间&#xff0c;看这个时间到第几个人理发了&#xff0c;然后找到临界值&#xff0c;看这个值的时候有那些理发师接待了新旅…

Base64 百科词条

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64&#xff0c;所以每6个位元为一个单元&#xff0c;对应某个可打印字符。三个字节有24个位元&#xff0c;对应于4个Base64单元&#xff0c;即3个字节需要用4个可打印字符来表示。它可用来作为电子…

java获取mysql执行计划_好程序员Java学习路线之MySQL的执行计划

好程序员Java学习路线之MySQL的执行计划。什么是执行计划&#xff1f;执行计划通常是开发者优化SQL语句的第一步。MySQL在解析SQL语句时&#xff0c;会生成多套执行方案&#xff0c;然后内部会进行一个成本的计算&#xff0c;然后通过优化器选择一个最优的方案执行&#xff0c;…

Web系统开发构架再思考-前后端的完全分离

前言 前后端完全分离其实一直是Web开发人员的梦想,也一直是我的梦想,遥想当年,无论是直接在代码里面输出HTML,还是在HTML里面嵌入各种代码,都不能让人感到满意.期间的痛苦和纠结,我想所有Web开发人员都深有感触. 由于最近几年一直在MS平台,从Web Form到MVC,MS平台虽然易用好学,…

文科思维Java_开源之Processing:这好玩的编程语言是为文科生艺术家准备的

说起编程语言&#xff0c;我们很多时候第一反应就是很难&#xff0c;都是理工科计算机相关行业的人才学的&#xff0c;都是为理科生掉头发准备的。的确&#xff0c;计算机的严谨&#xff0c;注定要求开发应用的人有缜密的理工科的理性逻辑思维&#xff0c;然而一人客从另一方面…

poj 1862 Stripies/优先队列

原题链接&#xff1a;http://poj.org/problem?id1862 简单题&#xff0c;贪心优先队列主要练习一下stl大根堆 写了几种实现方式写成类的形式还是要慢一些。。。 手打的heap&#xff1a; 1&#xff1a; 1 #include<cstdio>2 #include<cstdlib>3 #include<cmath&…

java timezone id_java.util.TimeZone.setID()方法实例

全屏setID(String ID)方法被用于设置时区ID。这不会改变的时区对象中的任何其他数据。声明以下是java.util.TimeZone.setID()方法的声明。public void setID(String ID)参数ID--这是新的时区ID。返回值NA异常NA例子下面的例子显示java.util.TimeZone.setID()方法的使用package …

创建一个自己的GitHub,创建自己的开源项目

作者是一个大学在读学生&#xff0c;自己在平时的学习中&#xff0c;GitHub上的开源项目给自己提供了很大的帮助。GitHub是目前使用最广泛的分布式项目管理软件&#xff0c;GitHub上面托管了许多非常优秀的开源项目。我觉得每一个从事IT行业都应该有一个属于自己的GitHub。下面…

Ubuntu如何安装setuptools

首先百度setuptools&#xff0c;基本第一个就是官网的结果然后我们看到有两个这样的文件第一个不用想了&#xff0c;如果你要使用第一个的话&#xff0c;还要首先安装wheel。我们这里直接用鼠标选中第二个zip文件&#xff0c;然后右键&#xff0c;复制链接。然后在我们的Ubuntu…

JMeter学习(四)参数化、断言、集合点

1.参数化 录制脚本中有登录操作&#xff0c;需要输入用户名和密码&#xff0c;假如系统不允许相同的用户名和密码同时登录&#xff0c;或者想更好的模拟多个用户来登录系统。 这个时候就需要对用户名和密码进行参数化&#xff0c;使每个虚拟用户都使用不同的用户名和密码进行访…