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 ...
随机推荐
- JDBC使用8.0驱动包连接mysql设置时区serverTimezone
驱动包用的是新版 mysql-connector-java-8.0.16.jar新版的驱动类改成了com.mysql.cj.jdbc.Driver新版驱动连接url也有所改动I.指定时区 如果不设置时 ...
- Navicat premium工具转储数据表的结构时,datatime字段报错
Navicat premium工具导出数据库: Navicat premium工具导入数据库: 运行SQL文件,遇到的错误,红色下划线提示,发现:(SQL文件的时间有问题) 不是insert语句有问题 ...
- How to read request body in a asp.net core webapi controller?
原文 How to read request body in a asp.net core webapi controller? A clearer solution, works in ASP.Ne ...
- 在windows中使用PuTTy上传下载文件和目录
打开windows的cmd,使用cd命令切换到PuTTy安装目录 C:\Users\NUC>cd C:\Program Files\PuTTY 在cmd中使用pscp命令上传下载文件 windo ...
- Web.sitemap网站导航
全文注释: Web.sitemap导航XML文件,站点地图,功能实现菜单 1.xml的版本1.0 和编码utf-8 2.Url链接 Title显示的标题 Description描述(ToolTip) ...
- Java调用Http/Https接口(1)--编写服务端
Http接口输入的数据一般是键值对或json数据,返回的一般是json数据.本系列文章主要介绍Java调用Http接口的各种方法,本文主要介绍服务端的编写,方便后续文章里的客户端的调用.文中所使用到的 ...
- ASP.NET MVC+Entity Framework code first 迁移
再来一张,选择 MVC 模版,其他的没选过,不会用 =_=!! 身份验证用个人用户账户,这个是为了偷懒,话说 ASP.NET Identity 还是很给力的,不用白不用 ^_^~ 点击确定之后,会看 ...
- 试用一款网荐的 iOS 快速布局UI库
NerdyUI github: https://github.com/nerdycat/NerdyUI Cupcake (Swift 版本) github: https://github.com/ ...
- 【面试突击】- Mybatis-#{}和${}的区别
原文链接:mybatis中#{}和${}的区别 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时 ...
- 使用python库relate搭建LMS学习管理系统
Relate is an Environment for Learning And TEaching Relate是在 Django上面构建的,可以快速搭建LMS系统,该系统可以方便学习管理和在线课程 ...