AC自动机+全概率+记忆化DP UVA 11468 Substring
题意:训练指南P217
分析:没有模板串也就是在自动机上走L步,不走到val[u] == v的节点的概率
PS:边读边insert WA了,有毒啊!
#include <bits/stdc++.h>
using namespace std; const int K = 20 + 5;
const int L = 100 + 5;
const int NODE = K * K;
const int SIZE = 66;
int idx[256], n;
struct AC {
int ch[NODE][SIZE], fail[NODE], match[NODE], sz;
void clear(void) {
memset (ch[0], 0, sizeof (ch[0]));
sz = 1;
}
void insert(char *P) {
int u = 0, lenp = strlen (P);
for (int c, i=0; i<lenp; ++i) {
c = idx[P[i]];
if (!ch[u][c]) {
memset (ch[sz], 0, sizeof (ch[sz]));
match[sz] = 0;
ch[u][c] = sz++;
}
u = ch[u][c];
}
match[u] = 1;
}
void build(void) {
queue<int> que; fail[0] = 0;
int u;
for (int c=0; c<SIZE; ++c) {
u = ch[0][c];
if (u) {
fail[u] = 0; que.push (u);
}
}
while (!que.empty ()) {
int r = que.front (); que.pop ();
for (int c=0; c<SIZE; ++c) {
int u = ch[r][c];
if (!u) {
ch[r][c] = ch[fail[r]][c]; continue;
}
que.push (u);
int v = fail[r];
while (v && !ch[v][c]) v = fail[v];
fail[u] = ch[v][c];
match[u] |= match[fail[u]];
}
}
}
}ac; double prob[SIZE];
bool vis[NODE][L];
double dp[NODE][L];
double DFS(int u, int len) {
if (!len) return 1.0;
if (vis[u][len]) return dp[u][len];
vis[u][len] = true;
double &ret = dp[u][len];
ret = 0;
for (int i=0; i<n; ++i) {
if (!ac.match[ac.ch[u][i]]) ret += prob[i] * DFS (ac.ch[u][i], len - 1);
}
return ret;
}
char pattern[30][30];
//char pattern[30]; int main(void) {
int T, cas = 0; scanf ("%d", &T);
while (T--) {
//char pattern[30];
ac.clear ();
int k; scanf ("%d", &k);
for (int i=1; i<=k; ++i) {
scanf ("%s", &pattern[i]);
//scanf ("%s", &pattern);
//ac.insert (pattern);
}
//ac.build ();
scanf ("%d", &n);
char str[3];
for (int i=0; i<n; ++i) {
scanf ("%s%lf", &str, &prob[i]);
idx[str[0]] = i;
}
for (int i=1; i<=k; ++i) ac.insert (pattern[i]);
ac.build ();
int len; scanf ("%d", &len);
memset (vis, false, sizeof (vis));
printf ("Case #%d: %.6lf\n", ++cas, DFS (0, len));
} return 0;
}
AC自动机+全概率+记忆化DP UVA 11468 Substring的更多相关文章
- BZOJ 1444 [JSOI2009]有趣的游戏 (AC自动机、概率与期望DP、矩阵乘法)
诶这题洛谷居然没有??? 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1444 题解: 我见到主要有三种做法. 一是矩阵乘法.设\(d ...
- UVA 11468 AC自动机入门题 记忆化概率dp+ac自动机
/** 链接:https://vjudge.net/problem/UVA-11468 详见lrj训练指南P218 我的是反向求存在模板串的概率. dp[i][j]表示当前i位置选择字符,前面i-1个 ...
- UVA - 11324 The Largest Clique 强连通缩点+记忆化dp
题目要求一个最大的弱联通图. 首先对于原图进行强连通缩点,得到新图,这个新图呈链状,类似树结构. 对新图进行记忆化dp,求一条权值最长的链,每一个点的权值就是当前强连通分量点的个数. /* Tarja ...
- Codeforces1107E Vasya and Binary String 记忆化dp
Codeforces1107E 记忆化dp E. Vasya and Binary String Description: Vasya has a string \(s\) of length \(n ...
- uva 11468 - Substring(AC自己主动机+概率)
题目链接:uva 11468 - Substring 题目大意:给出一些字符和各自字符相应的选择概率.随机选择L次后得到一个长度为L的字符串,要求该字符串不包括随意一个子串的概率. 解题思路:构造AC ...
- Google Code Jam 2009, Round 1C C. Bribe the Prisoners (记忆化dp)
Problem In a kingdom there are prison cells (numbered 1 to P) built to form a straight line segment. ...
- cf835(预处理 + 记忆化dp)
题目链接: http://codeforces.com/contest/835/problem/D 题意: 定义 k 度回文串为左半部分和右半部分为 k - 1 度的回文串 . 给出一个字符串 s, ...
- cf779D(记忆化dp)
题目链接: http://codeforces.com/problemset/problem/799/D 题意: 给出两个矩阵边长 a, b, 和 w, h, 以及一个 c 数组, 可选择 c 数组中 ...
- POJ 1088 滑雪(简单的记忆化dp)
题目 又一道可以称之为dp的题目,虽然看了别人的代码,但是我的代码写的还是很挫,,,,,, //看了题解做的简单的记忆化dp #include<stdio.h> #include<a ...
随机推荐
- Android Studio新建了一个项目提示Error:Unable to start the daemon process
提示如下错误:
- iOS开发MAC下配置svn
版本控制对于团队合作显得尤为重要,那么如何在iOS开发中进行版本控制呢?在今天的博客中将会介绍如何在MAC下配置SVN服务器,如何导入我们的工程,如何在Xcode中进行工程的checkOut和Comm ...
- 单击双击手势(UITapGestureRecognizer)
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...
- [Android Pro] Android studio jni中调用Log输出调试信息
reference to : http://www.linuxidc.com/Linux/2014-02/96341.htm Android 开发中,java 可以方便的使用调试信息Log.i, Lo ...
- Linux解决关闭终端后终止服务问题
可使用nohup. 具体使用方法,参见:http://zjking.blog.51cto.com/976858/1117828
- Xcode - 修改变量名、类名及字符串的替换操作
在做iOS开发代码优化的工作时,优化代码结构之前,我们应该先整理好工程的外貌,将文件和类的命名进行规范,在Xcode中为我们提供了方便而强大的名称修改功能. 第一步:修改类名 将鼠标点击放在类的名称上 ...
- mysql 关于列的语句
查看列:desc 表名; 修改表名:alter table t_book rename to bbb; 添加列:alter table 表名 add column 列名 varchar(30); 删除 ...
- Android ANR分析(三)
http://www.jianshu.com/p/8964812972be http://stackoverflow.com/questions/704311/android-how-do-i-inv ...
- ytu 1064: 输入三个字符串,按由小到大的顺序输出(水题,字符串处理)
1064: 输入三个字符串,按由小到大的顺序输出 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 471 Solved: 188[Submit][Sta ...
- [LeetCode] Word Break II (TLE)
Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each ...