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 ...
随机推荐
- Retrofit2 项目配置
在项目的 app build.gradle 文件中加入 dependencies { // Retrofit2implementation 'com.squareup.retrofit2:retro ...
- 7款让人惊叹的HTML5粒子动画特效(转载)
1.HTML5 Canvas粒子模拟效果 这是一款利用HTML5 Canvas模拟出来的30000个粒子动画,当你用鼠标在canvas画布上移动时,鼠标周围的一些粒子就会跟着你移动,并形成一定的图案, ...
- python re(正则表达式模块)学习
一.简介 正则表达式本身是一种小型的.高度专业化的编程语言,而在python中,通过内嵌集成re模块,程序媛们可以直接调用来实现正则匹配.正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎 ...
- 在IOS应用中打开另外一个应用的解决方案
最近要在IOS中实现一个应用启动另外一个应用的功能,搜了一些资料,使用UIApplication的openURL:的方法就能实现,现在整理和大家分享一下! 注册自定义URL协议 首先被启动的应用需要向 ...
- Gym 101981K - Kangaroo Puzzle - [玄学][2018-2019 ACM-ICPC Asia Nanjing Regional Contest Problem K]
题目链接:http://codeforces.com/gym/101981/problem/K Your friend has made a computer video game called “K ...
- Java ee第七周作业
一.什么是JSON?JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度. JSON就是一串字符串 只不过元素会使用特定的 ...
- Fiddler (进阶)内置命令与断点
Fiddler 内置命令与断点 命令 对应请求项 介绍 示例 ? All 问号后边跟一个字符串,可以匹配出包含这个字符串的请求 ?google > Body 大于号后面跟一个数字,可以匹配出请求 ...
- bootstrap 中关于 HTML5 aria-* and role的用法
HTML5 aria-* and role 在bootstrap中看到role和aria-*,不知道干嘛的.google一下,发现aria的意思是Accessible Rich Internet Ap ...
- 4、Flutter 采坑记录篇二_依赖库不兼容
1.报错信息 Because every version of flutter_test from sdk depends on package_resolver 1.0.4 which depend ...
- Oracle 11g R2创建数据库之手工建库方式
在之前的博文当中梳理了关于DBCA静默方式创建数据库的过程,本文就手工通过SQL*PLUS客户端采用CREATE DATABASE语句创建数据库.这种建库方式就是完全使用手工SQL语句创建数据库,通常 ...