AC自己主动机的题,须要注意的,建立失配边的时候,假设结点1失配边连到的那个结点2,那个结点2是一个单词的结尾,那么这个结点1也须要标记成1(由于能够看成,这个结点包括了这个单词),之后在Trie树上进行行走,每次走到下一个能够走的结点。

14378527 11468 Substring Accepted C++ 0.585 2014-10-19 10:35:00

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn = 444;
const int max_size = 66;
const int maxd = 111;
int M,Case = 1;
int ch[max_size];
double P[max_size];
int index(int c){
if(c >= 'A' && c <= 'Z') return c - 'A';
if(c >= 'a' && c <= 'z') return c - 'a' + 26;
if(c >= '0' && c <= '9') return c - '0' + 52;
}
struct Trie{
int next[maxn][max_size];
int fail[maxn];
int val[maxn];
int vis[maxn][maxd];
double dp[maxn][maxd];
int sz,root;
int newnode(){
val[sz] = 0;
memset(next[sz],-1,sizeof(next[sz]));
sz ++;
return sz - 1;
}
void init(){
sz = 0;
root = newnode();
memset(vis,0,sizeof(vis));
return;
}
void insert(char *str){
int now = root;
int L = strlen(str);
for(int i = 0; i < L; i++){
int e = index(str[i]);
if(next[now][e] == -1)
next[now][e] = newnode();
now = next[now][e];
}
val[now] = 1;
return;
}
void build(){
queue<int>q;
fail[root] = root;
for(int i = 0; i < max_size ; i++)
if(next[root][i] != -1){
fail[next[root][i]] = root;
q.push(next[root][i]);
}
else
next[root][i] = root;
while(!q.empty()){
int now = q.front(); q.pop();
for(int i = 0; i < max_size ; i++){
if(next[now][i] == -1)
next[now][i] = next[fail[now]][i];
else{
q.push(next[now][i]);
fail[next[now][i]] = next[fail[now]][i];
val[next[now][i]] |= val[fail[next[now][i]]];
}
}
}
return;
}
double DP(int pos,int L){
if(!L) return 1.0;
if(vis[pos][L])
return dp[pos][L];
vis[pos][L] = 1;
double &ans = dp[pos][L];
ans = 0.0;
for(int i = 0; i < M; i++){
int e = ch[i];
if(!val[next[pos][e]])
ans += P[i] * DP(next[pos][e],L - 1);
}
return ans;
}
}ac;
int main(){
int T;
scanf("%d",&T);
while(T--){
ac.init();
int K;
scanf("%d",&K);
for(int i = 0; i < K; i++){
char str[maxn];
scanf("%s",str);
ac.insert(str);
}
ac.build();
scanf("%d",&M);
for(int i = 0; i < M; i++){
char str[maxn];
scanf("%s%lf",str,&P[i]);
ch[i] = index(str[0]);
}
int L;
scanf("%d",&L);
double ans = ac.DP(0,L);
printf("Case #%d: %.6f\n",Case++,ans);
}
return 0;
}

【UVA】11468-Substring(AC自己主动机)的更多相关文章

  1. uva 11468 - Substring(AC自己主动机+概率)

    题目链接:uva 11468 - Substring 题目大意:给出一些字符和各自字符相应的选择概率.随机选择L次后得到一个长度为L的字符串,要求该字符串不包括随意一个子串的概率. 解题思路:构造AC ...

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

    题意:给出一个字母表以及每个字母出现的概率.再给出一些模板串S.从字母表中每次随机拿出一个字母,一共拿L次组成一个产度为L的串, 问这个串不包含S中任何一个串的概率为多少? 析:先构造一个AC自动机, ...

  3. UVA 10679 I love Strings!!!(AC自己主动机)

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  4. 【UVA】1449-Dominating Patterns(AC自己主动机)

    AC自己主动机的模板题.须要注意的是,对于每一个字符串,须要利用map将它映射到一个结点上,这样才干按顺序输出结果. 14360841 1449 option=com_onlinejudge& ...

  5. ZOJ - 3228 Searching the String (AC自己主动机)

    Description Little jay really hates to deal with string. But moondy likes it very much, and she's so ...

  6. HDOJ 5384 Danganronpa AC自己主动机

     AC自己主动机裸题 Danganronpa Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java ...

  7. hdu5384 AC自己主动机模板题,统计模式串在给定串中出现的个数

    http://acm.hdu.edu.cn/showproblem.php?pid=5384 Problem Description Danganronpa is a video game franc ...

  8. POJ 2778 DNA Sequence (AC自己主动机 + dp)

    DNA Sequence 题意:DNA的序列由ACTG四个字母组成,如今给定m个不可行的序列.问随机构成的长度为n的序列中.有多少种序列是可行的(仅仅要包括一个不可行序列便不可行).个数非常大.对10 ...

  9. hdu 2222 Keywords Search ac自己主动机

    点击打开链接题目链接 Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Ja ...

随机推荐

  1. unity学习笔记1--Space Shooter

    其实我一直觉得我是个模棱两可的人,就计算机这块来说,自己还是想制作游戏什么的,但是又得考虑到现实就业的问题,所以现在自己主要在学安卓和javaweb.现在大概是心血来潮吧,突然想追逐下自己的理想,虽然 ...

  2. hdu 5170(数学)

    GTY's math problem Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  3. sonarQube Github pull request扫描代码

    参考官方地址:https://docs.sonarqube.org/display/PLUG/GitHub+Plugin 运行环境:sonarQube6.2 + sonarScanner2.8 近来, ...

  4. JS—正则表达式

    正则表达式的元字符是包含特殊含义的字符,它们有一些特殊的功能,可以控制匹配模式的方式,反斜杠后的元字符失去其特殊含义. 单个字符和数字 .表示匹配除换行符外的单个字符,两个.就表示匹配两个字符 var ...

  5. [thinkphp] 公共头部底部如何传递数据

    分组底下有一个公共模板文件夹 Modules/Index/Tpl/public/ 如何传递数据给模板呢? 在  入口文件/Lib/Action/  中创建类CommonAction.class.php ...

  6. (8)python 类和对象

    一.类和对象 python可以动态的添加删除变量和方法 类中的方法至少要有一个参数,第一个参数会被绑定到类的实例上,通常命名为self 1.构造函数 类中的构造方法名为 __init__(self,. ...

  7. (2)Python 变量和运算符

    一.python变量特点 python是弱类型语言,无需声明变量可以直接使用并且变量的数据类型可以动态改变 二.变量命名规则 1.不能使用python关键字 2.不能数字开头 3.不能包含空格 4.不 ...

  8. 使用es索引遇到的问题记录

    1设置es索引的运行内存: 直接在启动文件里面改就好,启动命令是elasticsearch.bat,用notepad++编辑这个文件,里面添加这样的一行:SET ES_HEAP_SIZE=10g即可 ...

  9. ASP.NET Core 2.2 基础知识(十三) WebAPI 概述

    我们先创建一个 WebAPI 项目,看看官方给的模板到底有哪些东西 官方给出的模板: [Route("api/[controller]")] [ApiController] pub ...

  10. 软件工程中的反面模式(anti-pattern)

    软件设计 抽象倒置(Abstraction inversion):不把用户需要的功能直接提供出来,导致他们要用更上层的函数来重复实现 用意不明(Ambiguous viewpoint):给出一个模型( ...