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 ...
随机推荐
- 使用PHP开发HR系统(1)
本文通过笔者的实践,讲述如何以PHP+CI+Postgres构建一套人力资源管理系统. ======================================================== ...
- 在springMVC的controller中获取request,response对象的一个方法
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttr ...
- VirtualBox导入OVA文件文档教程
1 2 修改框住的路径,最好不要在C盘 3 取消检查更新 4 5 6 7 8 9 10 11 等待加载完成:加载完成后 OVA文件导入成功 作者:含笑半步颠√ 博客链接:https://www.cnb ...
- Description Resource Path Location Type Unknown Unknown Unknown org.eclipse.core.internal.resources.Marker is not of a displayable type
是访问限制报错. 方法一: 全局属性Project>preferences>java>Compiler>Errors/Warnings>把右侧的[Deprecated a ...
- NEST 多IndexType与分页
/// <summary> /// POST /_all/employee/_search?typed_keys=true /// </summary> public void ...
- Nginx四个作用
本文只针对Nginx在不加载第三方模块的情况能处理哪些事情,由于第三方模块太多所以也介绍不完. Nginx能做什么 ——反向代理 ——负载均衡 ——HTTP服务器(动静分离) ——正向代理 以上就是我 ...
- 谷歌浏览器解决ajax跨域问题
在用mui和H5+做混合开发,会利用HBuildx去真机调试,可真机调试总有问题所在,懂得人自然懂,而我们直接打开页面显示的只有一个静态的页面,是获取不到数据的在这里我想说的不是代码中利用jsonp, ...
- Java 之 Servlet中的生命周期
Servlet 生命周期 一.重写servlet方法 当创建一个类,继承 servlet 这个接口时,需要实现里面的抽象方法. import javax.servlet.*; import java. ...
- android AlertDialog控件使用
1.先创建activity_alert_dialog.xml <?xml version="1.0" encoding="utf-8"?> < ...
- Java RMI学习
网上资料: Java RMI Tutorial Dynamic code downloading using RMI RPC-维基:Remote procedure call implementing ...