UVA11468 Substring
思路
AC自动机+概率dp
设f[i][j]表示当前在第i位在AC自动机的第j个节点,满足条件的概率
AC自动机上的一个节点能被转移到当且仅当这个节点不是中止节点且无法通过fail指针跳到任何一个中止节点
答案就是\(\sum_{x\in node} dp[L][x]\)
注意本题字符集为09,AZ,a~z
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
int Trie[410][64],fail[410],Nodecnt,root,ban[410],a[410],K,N,L;
double f[110][410],p[410];
char s[410];
int tonum(char c){
if(c>='a'&&c<='z')
return c-'a';//0~25
else if(c>='A'&&c<='Z')
return c-'A'+26;//26~51
else if(c>='0'&&c<='9')
return c-'0'+52;
}
void insert(char *s,int len){
int o=root;
for(int i=0;i<len;i++){
if(!Trie[o][tonum(s[i])])
Trie[o][tonum(s[i])]=++Nodecnt;
o=Trie[o][tonum(s[i])];
}
ban[o]=true;
}
queue<int> q;
void get_AC(void){
for(int i=0;i<64;i++){
if(Trie[root][i]){
fail[Trie[root][i]]=root;
if(ban[fail[Trie[root][i]]])
ban[Trie[root][i]]=true;
q.push(Trie[root][i]);
}
}
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=0;i<64;i++){
if(Trie[x][i]){
fail[Trie[x][i]]=Trie[fail[x]][i];
if(ban[fail[Trie[x][i]]])
ban[Trie[x][i]]=true;
q.push(Trie[x][i]);
}
else
Trie[x][i]=Trie[fail[x]][i];
}
}
}
double dp(void){
int o=root;
f[0][root]=1.0;
for(int i=0;i<L;i++){
for(int j=0;j<=Nodecnt;j++)
if(!ban[j])
for(int k=1;k<=N;k++)
if(!ban[Trie[j][tonum(a[k])]])
f[i+1][Trie[j][tonum(a[k])]]+=f[i][j]*p[k];
}
double ans=0;
for(int i=0;i<=Nodecnt;i++)
ans+=f[L][i];
return ans;
}
void init(void){
Nodecnt=0;
root=0;
memset(Trie,0,sizeof(Trie));
memset(fail,0,sizeof(fail));
memset(f,0,sizeof(f));
memset(ban,0,sizeof(ban));
}
int main(){
// freopen("test.in","r",stdin);
// freopen("test.out","w",stdout);
int T,cnt=0;
scanf("%d",&T);
while(T--){
cnt++;
init();
scanf("%d",&K);
for(int i=1;i<=K;i++){
scanf("%s",s);
insert(s,strlen(s));
}
scanf("%d",&N);
for(int i=1;i<=N;i++){
char c=getchar();
while((c<'a'||c>'z')&&(c<'A'||c>'Z')&&(c<'0'||c>'9'))
c=getchar();
// printf("c=%c\n",c);
a[i]=c;
scanf("%lf",&p[i]);
}
scanf("%d",&L);
get_AC();
printf("Case #%d: %.6lf\n",cnt,dp());
}
return 0;
}
UVA11468 Substring的更多相关文章
- UVA11468 Substring --- AC自动机 + 概率DP
UVA11468 Substring 题目描述: 给定一些子串T1...Tn 每次随机选择一个字符(概率会给出) 构造一个长为n的串S,求T1...Tn不是S的子串的概率 直接把T1...Tn建成AC ...
- UVA-11468 Substring(AC自动机+DP)
题目大意:给一些模板串,一些字符的出现概率.问不会出现模板串的概率是多少. 题目分析:是比较简单的概率DP+AC自动机.利用全概率公式递推即可. 代码如下: # include<iostream ...
- LeetCode[3] Longest Substring Without Repeating Characters
题目描述 Given a string, find the length of the longest substring without repeating characters. For exam ...
- 最长回文子串-LeetCode 5 Longest Palindromic Substring
题目描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
- POJ3693 Maximum repetition substring [后缀数组 ST表]
Maximum repetition substring Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9458 Acc ...
- [LeetCode] Longest Substring with At Least K Repeating Characters 至少有K个重复字符的最长子字符串
Find the length of the longest substring T of a given string (consists of lowercase letters only) su ...
- substring的用法
public String substring(int beginIndex, int endIndex) 返回一个新字符串,它是此字符串的一个子字符串.该子字符串从指定的 beginIndex 处开 ...
- jQuery之常用且重要方法梳理(target,arguments,slice,substring,data,trigger,Attr)-(一)
1.jquery data(name) data() 方法向被选元素附加数据,或者从被选元素获取数据. $("#btn1").click(function(){ $(" ...
- leetcode--5. Longest Palindromic Substring
题目来自 https://leetcode.com/problems/longest-palindromic-substring/ 题目:Given a string S, find the long ...
随机推荐
- linux安装jdk和tomcat命令
1.linux centos6.5 安装jdk1.在/usr/local/src目录下,创建java文件夹,拷贝jdk安装包到/usr/local/src/java下面:cd /usr/local/s ...
- linux 系统全盘备份
备份程序对比 - Synchronization and backup programs 之前用的 tar进行备份了,更新 grub引导需要重建目录和手动挂载,不是很方便.现直接使用 timeshif ...
- c++试题2
一.写出下列程序的运行结果(40 分) 1.for(i=1;i<5;i++); cout << “OK” << endl; 程序执行后的输出结果是: OK ___ ...
- python语法_变量及命名规则
变量:存储信息的,日后被调用,修改操作 常量:固定不变的量,字母大写 变量命名规则: 1 有字母,数字以及下划线等符号组成 2 区分大小写 3 不能使用数字开头,不能含有特殊字符和空格 4 不能使用 ...
- vue基本语法
使用"{{ }}"来插入文本 使用v-html来插入html元素 v-bind给元素绑定属性,例如下面的,将title属性指定为data.title相同的值.v-bind指令后面的 ...
- React Router API文档
React Router API文档 一.<BrowserRouter> 使用HTML5历史记录API(pushState,replaceState和popstate事件)的<Rou ...
- 项目实战03:Keepalived 实现高可用
目录 实验一:实现keepalived主从方式高可用基于LVS-DR模式的应用实战: 1.环境准备: 2.在lvs-server-master 主上 3.在lvs-server-backup 从上 4 ...
- Spring 学习教程(二): IOC/DI+AOP
1. IOC / DI Spring是一个基于IOC和AOP的结构J2EE系统的框架 IOC 反转控制 是Spring的基础,Inversion Of Control 简单说就是创建对象由以前的程序员 ...
- 求职季全攻略:优秀的UX设计师作品集该如何准备?
这是一篇关于如何制作杰出的UX设计师作品集,看了下文,我们在2019年冲冲冲~制作出自己的作品集! 转自墨刀公众号. Paul Rand 曾经说:“设计很简单,因而也复杂.” 也许你已经掌握了所有的U ...
- pandas处理时间序列(1):pd.Timestamp()、pd.Timedelta()、pd.datetime( )、 pd.Period()、pd.to_timestamp()、datetime.strftime()、pd.to_datetime( )、pd.to_period()
Pandas库是处理时间序列的利器,pandas有着强大的日期数据处理功能,可以按日期筛选数据.按日期显示数据.按日期统计数据. pandas的实际类型主要分为: timestamp(时间戳) ...