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 ...
随机推荐
- ZooKeeper注册中心安装详细步骤(单节点)
安装 Dubbo 注册中心 Dubbo 建议使用 Zookeeper 作为服务的注册中心. 注册中心服务器(192.168.3.71)配置,安装 Zookeeper: 1. 修改操作系统的/etc/h ...
- freertos 建立任务超过几个后系统不能能运行
/* *** NOTE *********************************************************** If you find your application ...
- Eclispe最常用的几个快捷键
熟练使用快捷键可以在很大程度上提高我们的工作效率,Eclipse的快捷键很多,但是常用的也就那么几个,下面说下Eclispe最常用的几个快捷键: Eclipse的快捷键组合可在Eclipse按下ctr ...
- Finalize方法的生成
Finalize在c#编程语言中需要特殊语法,因此,c#要求在类名前加~符号来定义Finalize方法:例如 internal class FinalizeDemo { ~FinalizeDemo() ...
- AndrewNG Deep learning课程笔记 - CNN
参考, An Intuitive Explanation of Convolutional Neural Networks http://www.hackcv.com/index.php/archiv ...
- Java学习:注解,反射,动态编译
狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! Java学习:注解,反射,动态编译 Annotation 注解 什么是注解 ? Annotat ...
- DIOCP3-粘包处理
DIOCP3-粘包处理 什么是粘包: 第一次发送 12345, 第二次发送abcde, 底层socket可能会一次性进行发送12345abcde,或者对方可能一次性进行了接收,那接收的时候,你可 ...
- sale.order
# 初始化一个变量用来记录产品类型line_type = ''# 循环明细行for product in self.options: # 拿到该明细行的产品类型 product_type = prod ...
- nginx基本用法和HTTPS配置
nginx作用讲解:1.反向代理:需要多个程序共享80端口的时候就需要用到反向代理,nginx是反向代理的一种实现方式.2.静态资源管理:一般使用nginx做反向代理的同时,应该把静态资源交由ngin ...
- Jmeter学习之-http接口功能测试-入门
ps:默认已经安装好Jmeter工具,配置好相关环境 打开jmeter 工具,为测试计划重新命名 添加线程组:在测试计划上右键,依次选择“添加>Threads>线程组” 添加http请求: ...