UVA 11468 Substring (记忆化搜索 + AC自动鸡)
题意: 给你K个模式串, 然后,再给你 n 个字符, 和它们出现的概率 p[ i ], 模式串肯定由给定的字符组成。
且所有字符,要么是数字,要么是大小写字母。 问你生成一个长度为L的串,不包含任何模式串的概率是多少。
解: 记忆化搜索 + AC自动机。 对模式串建一个AC自动机, 不需要last[ ] 和 val[ ], 只需要一个 metch[ ]。
维护一下这个点是否是某个模式串的最后一个字符节点,若是,则这个点不能走。
然后, 剩下的就是从根节点,随便走 L 步, 记得要记忆化, 否则超时。
记得数组开足够大, 否则 wa 一下午。
#include <bits/stdc++.h>
#define LL long long
#define rep(i, j, k) for(int i = j; i <= k; i++)
#define dep(i, j, k) for(int i = k; i >= j; i--)
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3f3f3f3f
#define mem(i, j) memset(i, j, sizeof(i))
#define pb push_back
using namespace std; const int N = * + , M = ;
char op[];
double tmp;
struct Trie {
int a[N][M], tot, metch[N], Fail[N], vis[N][M], n;
double p[N], dp[N][M];
char ch[M];
void init() {
mem(a[], ); tot = ; metch[] = ; mem(dp, ); mem(p, ); mem(vis, );
}
int get(char Q) {
if(Q >= '' && Q <= '') return Q - '' + ;
if(Q >= 'A' && Q <= 'Z') return Q - 'A' + ;
return Q - 'a' + ;
}
void join(char s[]) {
int now = ; int len = strlen(s);
rep(i, , len - ) {
int id = get(s[i]);
if(!a[now][id]) {
mem(a[tot], ); metch[tot] = ;
a[now][id] = tot++;
}
now = a[now][id];
}
metch[now] = ;
}
void getFail() {
queue<int> Q; while(!Q.empty()) Q.pop();
rep(i, , M - ) {
if(a[][i]) {
Q.push(a[][i]); Fail[a[][i]] = ;
}
}
while(!Q.empty()) {
int now = Q.front(); Q.pop();
rep(i, , M - ) {
int u = a[now][i];
if(u == ) a[now][i] = a[Fail[now]][i];
else {
Q.push(u);
Fail[u] = a[Fail[now]][i];
metch[u] |= metch[Fail[u]];
}
}
}
}
double dfs(int now, int L) {
if(!L) return 1.0;
if(vis[now][L]) return dp[now][L];
vis[now][L] = ;
double &ans = dp[now][L];
ans = 0.0;
rep(i, , M - ) { /// 枚举所有可能字符
if(!metch[a[now][i]]) { /// 这个节点可以走
ans += p[i] * dfs(a[now][i], L - );
}
}
return ans;
}
void scan() {
scanf("%d", &n);
rep(i, , n) {
scanf("%s %lf", op, &tmp);
int id = get(op[]);
p[id] = tmp;
}
}
void print(int cas) {
int L; scanf("%d", &L);
printf("Case #%d: ", cas);
printf("%.6f\n", dfs(, L));
}
};
Trie AC;
char b[];
int main() {
int _; scanf("%d", &_); int cas = ;
while(_--) {
AC.init();
int k; scanf("%d", &k);
rep(i, , k) {
scanf("%s", b); AC.join(b);
}
AC.getFail();
AC.scan();
AC.print(++cas);
}
return ;
}
UVA 11468 Substring (记忆化搜索 + AC自动鸡)的更多相关文章
- DP(记忆化搜索) + AC自动机 LA 4126 Password Suspects
题目传送门 题意:训练指南P250 分析:DFS记忆化搜索,范围或者说是图是已知的字串构成的自动机图,那么用 | (1 << i)表示包含第i个字串,如果长度为len,且st == (1 ...
- UVA - 1631 Locker 记忆化搜索
题意:给定两个密码串,每次可以让1~3个相邻的密码向上或者向下滚动,每个密码是 ,问最少需要多少次滚动可以让原串成为目标串? 思路:假设当前要让第i位密码还原,我们可以同时转动,不同的转动方式会影响后 ...
- uva 10118,记忆化搜索
这个题debug了长达3个小时,acm我不能放弃,我又回来了的第一题! 一开始思路正确,写法不行,结果越改越乱 看了网上某神的代码,学习了一下 coding+debug:4小时左右,记忆化搜索+dp类 ...
- Substring Uva 11468_记忆化搜索 + AC自动机
Code: #include<cstdio> #include<cstring> #include<queue> using namespace std; cons ...
- BZOJ-3208|记忆化搜索-花神的秒题计划Ⅰ
背景[backboard]: Memphis等一群蒟蒻出题中,花神凑过来秒题-- 描述[discribe]: 花花山峰峦起伏,峰顶常年被雪,Memphis打算帮花花山风景区的人员开发一个滑雪项目. 我 ...
- uva 10581 - Partitioning for fun and profit(记忆化搜索+数论)
题目链接:uva 10581 - Partitioning for fun and profit 题目大意:给定m,n,k,将m分解成n份,然后依照每份的个数排定字典序,而且划分时要求ai−1≤ai, ...
- UVA - 10118Free Candies(记忆化搜索)
题目:UVA - 10118Free Candies(记忆化搜索) 题目大意:给你四堆糖果,每一个糖果都有颜色.每次你都仅仅能拿随意一堆最上面的糖果,放到自己的篮子里.假设有两个糖果颜色同样的话,就行 ...
- UVA - 10917 - Walk Through the Forest(最短路+记忆化搜索)
Problem UVA - 10917 - Walk Through the Forest Time Limit: 3000 mSec Problem Description Jimmy exp ...
- UVa 10285 Longest Run on a Snowboard - 记忆化搜索
记忆化搜索,完事... Code /** * UVa * Problem#10285 * Accepted * Time:0ms */ #include<iostream> #includ ...
随机推荐
- docker深入学习一
docker是一个客户服务器结构的应用程序,其结构如下所示 其组成部分包括 container容器:是image的运行实例,一般container之间以及container与主机之间是相互隔离的,相当 ...
- [UOJ #167]【UR #11】元旦老人与汉诺塔
题目大意:给你一个有$n$个盘子的汉诺塔状态$S$,问有多少种不同的操作方法,使得可以在$m$步以内到达状态$T$.$n,m\leqslant100$ 题解:首先可以知道的是,一个状态最多可以转移到其 ...
- 快速生成html文本文档——typora
下载地址:https://www.typora.io/#windows 一.工具界面: 二.使用工具编辑: 三.导出为html: 四.打开html查看: Markdown语法教程:https://ww ...
- Spring AOP创建Throwdvice实例
1.异常发生的时候,通知某个服务对象做处理 2.实现throwsAdvice接口 接口实现: public interface IHello { public void sayHello(String ...
- 扩展JS
//JS的扩展方法: 1 定义类静态方法扩展 2 定义类对象方法扩展 var aClass = function(){} //1 定义这个类的静态方法 aC ...
- ubuntu gcc 降级 适应matlab
一.安装gcc 4.7 Ubuntu14.04自带的gcc版本是4.8,MATLAB2014a支持的最高版本为4.7x.因此,需要安装gcc4.7,并给gcc降级 在终端执行gcc 4.7的安装命令: ...
- Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient报错,问题排查
背景 最近在整合pyspark与hive,新安装spark-2.3.3以客户端的方式访问hive数据,运行方式使用spark on yarn,但是在配置spark读取hive数据的时候,这里直接把hi ...
- C++ | 使用const std::map,map::[]时遇到的一个bug
原函数简化后如下: void fun(const map<int,vector<int>> &mp, int index) { for (auto tmp : mp[i ...
- Bootstrap 结合 PHP ,做简单的登录以及注册界面及功能
登录实现 HTML代码 <div class="container"> <?php if (isset($error_msg)): ?> <div c ...
- Qt 接受拖放
第一步:在构造函数里面 添加拖放支持,相当于总开关(注意这里设置之后是整个窗口可以接受拖放) setAcceptDrops(true); 第二步:重写接受拖放相关的虚函数 void dragEnter ...