题目链接:uva 11468 - Substring

题目大意:给出一些字符和各自字符相应的选择概率。随机选择L次后得到一个长度为L的字符串,要求该字符串不包括随意一个子串的概率。

解题思路:构造AC自己主动机之后。每随机生成一个字母。等于是在AC自己主动机上走一步。全部子串的结束位置的节点标记为禁止通行。然后问题转换成记忆搜索处理。

#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm> using namespace std; const int sigma_size = 62;
const int maxn = 405;; double pi[sigma_size], dp[maxn][105];
int vis[maxn][105]; int sz;
int ac[maxn][sigma_size];
int fail[maxn], last[maxn]; inline int idx (char ch) {
if (ch >= '0' && ch <= '9')
return ch - '0';
if (ch >= 'a' && ch <= 'z')
return ch - 'a' + 10;
if (ch >= 'A' && ch <= 'Z')
return ch - 'A' + 36;
return 0;
} void ahoc_insert (char *s) {
int u = 0, n = strlen(s);
for (int i = 0; i < n; i++) {
int v = idx(s[i]); if (ac[u][v] == 0) {
last[sz] = 0;
memset(ac[sz], 0, sizeof(ac[sz]));
ac[u][v] = sz++;
}
u = ac[u][v];
}
last[u] = 1;
} void ahoc_fail () {
queue<int> que; for (int i = 0; i < sigma_size; i++) {
int u = ac[0][i];
if (u) {
fail[u] = 0;
que.push(u);
}
} while (!que.empty()) {
int r = que.front();
que.pop(); for (int i = 0; i < sigma_size; i++) {
int u = ac[r][i]; if (u == 0) {
ac[r][i] = ac[fail[r]][i];
continue;
} que.push(u);
int v = fail[r]; while (v && !ac[v][i])
v = fail[v];
fail[u] = ac[v][i];
last[u] |= last[fail[u]];
}
}
} void init () {
int n, x;
char str[sigma_size];
memset(pi, 0, sizeof(pi));
memset(vis, 0, sizeof(vis)); sz = 1;
fail[0] = last[0] = 0;
memset(ac[0], 0, sizeof(ac[0])); scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%s", str);
ahoc_insert(str);
}
ahoc_fail(); scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%s", str);
scanf("%lf", &pi[idx(str[0])]);
}
} double getProb (int u, int dep) {
if (dep == 0)
return 1.0; if (vis[u][dep])
return dp[u][dep]; vis[u][dep] = 1; double& ans = dp[u][dep];
ans = 0; for (int i = 0; i < sigma_size; i++) {
if (last[ac[u][i]] == 0)
ans += pi[i] * getProb(ac[u][i], dep - 1);
}
return ans;
} int main () {
int cas;
scanf("%d", &cas);
for (int kcas = 1; kcas <= cas; kcas++) {
init(); int n;
scanf("%d", &n);
printf("Case #%d: %.6lf\n", kcas, getProb(0, n));
}
return 0;
}

uva 11468 - Substring(AC自己主动机+概率)的更多相关文章

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

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

  2. 【UVA】11468-Substring(AC自己主动机)

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

  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. [AC自己主动机+可能性dp] hdu 3689 Infinite monkey theorem

    意甲冠军: 给n快报,和m频率. 然后进入n字母出现的概率 然后给目标字符串str 然后问m概率倍的目标字符串是敲数量. 思维: AC自己主动机+可能性dp简单的问题. 首先建立trie图,然后就是状 ...

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

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

随机推荐

  1. eclipse中新建maven项目无法添加src/main/java问题

    eclipse创建maevn web项目,在选择maven_archetype_web原型后,默认只有src/main/resources这个Source Floder. 按照maven目录结构,添加 ...

  2. 快速入门Pandas

    教你十分钟学会使用pandas. pandas是python数据分析的一个最重要的工具. 基本使用 # 一般以pd作为pandas的缩写 import pandas as pd # 读取文件 df = ...

  3. java 协程框架kilim

    http://phl.iteye.com/blog/2247112 http://chen-tao.github.io/2015/10/02/kilim-work-way/ 待丰富

  4. Java-从字符串或一个子字符串中搜索一个字符

    indexOf函数 package com.tj; public class MyClass implements Cloneable { public static void main(String ...

  5. 指定字符串 s,返回 s 所有可能的子串,每个子串必须是一个回文(指顺读和倒读都一样的字符串)

    Given a string s, partition s such that every substring of the partition is a palindrome Return all ...

  6. 九度oj 题目1086:最小花费

    题目描述: 在某条线路上有N个火车站,有三种距离的路程,L1,L2,L3,对应的价格为C1,C2,C3.其对应关系如下: 距离s           票价 0<S<=L1         ...

  7. 数组dome

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  8. 算法复习——拓展欧几里得(poj1061)

    题目: Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很 ...

  9. 简单说明PHP的垃圾收集机制是怎样的?

    腾讯 对变量有个引用计数,计数到0时变量被销毁. ———————————————————————— 每一种语言都有自己的自动垃圾回收机制,让程序员不必过分关心程序内存分配,但是在OOP中,有些对象需要 ...

  10. Yii 之cookie的使用

    public function actionIndex(){ //设置cookie(注意这里用的是响应组件) $cookies = \YII::$app->response->cookie ...