思路

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的更多相关文章

  1. UVA11468 Substring --- AC自动机 + 概率DP

    UVA11468 Substring 题目描述: 给定一些子串T1...Tn 每次随机选择一个字符(概率会给出) 构造一个长为n的串S,求T1...Tn不是S的子串的概率 直接把T1...Tn建成AC ...

  2. UVA-11468 Substring(AC自动机+DP)

    题目大意:给一些模板串,一些字符的出现概率.问不会出现模板串的概率是多少. 题目分析:是比较简单的概率DP+AC自动机.利用全概率公式递推即可. 代码如下: # include<iostream ...

  3. LeetCode[3] Longest Substring Without Repeating Characters

    题目描述 Given a string, find the length of the longest substring without repeating characters. For exam ...

  4. 最长回文子串-LeetCode 5 Longest Palindromic Substring

    题目描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...

  5. POJ3693 Maximum repetition substring [后缀数组 ST表]

    Maximum repetition substring Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9458   Acc ...

  6. [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 ...

  7. substring的用法

    public String substring(int beginIndex, int endIndex) 返回一个新字符串,它是此字符串的一个子字符串.该子字符串从指定的 beginIndex 处开 ...

  8. jQuery之常用且重要方法梳理(target,arguments,slice,substring,data,trigger,Attr)-(一)

    1.jquery  data(name) data() 方法向被选元素附加数据,或者从被选元素获取数据. $("#btn1").click(function(){ $(" ...

  9. leetcode--5. Longest Palindromic Substring

    题目来自 https://leetcode.com/problems/longest-palindromic-substring/ 题目:Given a string S, find the long ...

随机推荐

  1. java第一次上机实验--验证码

    package javashiyan; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event. ...

  2. Lucene入门学习二

    接上篇:增删改查 增加:这里不做过多阐述. 删除:删除全部,根据条件删除 修该:先删除,后添加 查询(*):查询所有,精确查询,根据数值范围查询,组合查询,解析查询. package com.ithe ...

  3. 怎么访问不在网站目录下文件(iis虚拟目录设置)

    很多时候,上传的文件多了,架设服务器当初设定的主目录所在盘空间往往就不够了,怎么办?这就需要设置虚拟目录.虚拟目录就是将其他目录以映射的方式虚拟到该FTP服务器的主目录下,这样,一个FTP服务器的主目 ...

  4. ubuntu安装python3.6

    环境: ubuntu18.04 64位,python3.6.5 安装过程 1.打开终端 首先创建安装目录, sudo mkdir /usr/local/python3 2.然后下载安装包,解压,并且进 ...

  5. mysql批量插入

    有多种方式 其中效率高 要求低的方式 是 把sql拼接出来 后一次性commit: eg: public int insertBatch(List<PeccDetailModel> lis ...

  6. [学习] 从 函数式编程 到 lambda演算 到 函数的本质 到 组合子逻辑

    函数式编程 阮一峰 <函数式编程初探>,阮一峰是<黑客与画家>的译者. wiki <函数编程语言> 一本好书,<计算机程序的构造与解释>有讲到schem ...

  7. Hyper-v 虚拟机 关闭服务

    1.Win + R 运行 2.输入 services.msc 回车 3.禁用下图的服务

  8. 《Java程序设计》 第五周学习总结

    学号 20175313 <Java程序设计>第五周学习总结 教材学习内容总结 第六章主要内容 掌握接口的定义 接口声明:interface 接口名 接口体:包含常量的声明和抽象方法. 接口 ...

  9. 001-CPU多级缓存架构

    一.基本概念 大致关系: CPU Cache --> 前端总线 FSB (下图中的Bus) --> Memory 内存 CPU 为了更快的执行代码.于是当从内存中读取数据时,并不是只读自己 ...

  10. java框架之SpringBoot(11)-缓存抽象及整合Redis

    Spring缓存抽象 介绍 Spring 从 3.1 版本开始定义了 org.springframework.cache.Cache 和 org.springframework.cache.Cache ...