Codeforces 852G Bathroom terminal 【Trie树】
<题目链接>
题目大意:
现在给定出n个字符串,并且进行m此询问,每次询问给出一个匹配串,每次询问都给出该匹配串能够匹配的字符串个数(题目只出现字符'a'~'e')。'?'可以看成任意字符,也可以看做没有。
解题分析:
对这n个字符串建立Trie树,然后对每次输入的匹配串在trie树上进行模糊匹配,'?'的分类匹配主要体现在Trie树上的DFS过程。
#include<bits/stdc++.h>
using namespace std; const int M = ;
const int N = 1e5+;
int nxt[N*M][], val[N*M], flag[N*M];
char s[M], str[M];
int n, m, size = ; void insert(char *s){
int now = ;
for (int i=; s[i]; i++){
int to=s[i]-'a';
if (!nxt[now][to]) nxt[now][to] = ++size;
now = nxt[now][to];
}
val[now]++;
} int dfs(int loc, int now){ //u为trie树上的节点编号
if (!now) return ;
if (!str[loc]){
if (flag[now] == m+) return ; //Trie树上的同一字符串是否只匹配一次(因为下面进行了多次模糊匹配选择,可能会发生重复
else{
flag[now] = m+;
return val[now];
}
}
if (str[loc] != '?') return dfs(loc+, nxt[now][str[loc]-'a']); //如果当前字符匹配成功
//对于匹配串中为'?'字符的,具有以下两种选择
int res = dfs(loc+, now); //跳过匹配串中'?'的位置
for (int i=; i<; i++) //将'?'作为任意字符串,与Trie树上的字符进行匹配
res += dfs(loc+, nxt[now][i]);
return res;
} int main(){
scanf("%d%d", &n, &m);getchar();
for (int i=; i<=n; i++){
gets(s);
insert(s);
}
while (m--){
gets(str);
printf("%d\n", dfs(, ));
}
}
2019-02-22
Codeforces 852G Bathroom terminal 【Trie树】的更多相关文章
- trie树 Codeforces Round #367 D Vasiliy's Multiset
// trie树 Codeforces Round #367 D Vasiliy's Multiset // 题意:给一个集合,初始有0,+表示添加元素,-去除元素,?询问集合里面与x异或最大的值 / ...
- Codeforces 633C Spy Syndrome 2 | Trie树裸题
Codeforces 633C Spy Syndrome 2 | Trie树裸题 一个由许多空格隔开的单词组成的字符串,进行了以下操作:把所有字符变成小写,把每个单词颠倒过来,然后去掉单词间的空格.已 ...
- Codeforces 514 D R2D2 and Droid Army(Trie树)
题目链接 大意是判断所给字符串组中是否存在与查询串仅一字符之差的字符串. 关于字符串查询的题,可以用字典树(Trie树)来解,第一次接触,做个小记.在查询时按题目要求进行查询. 代码: #define ...
- Codeforces Round #333 (Div. 1) D. Acyclic Organic Compounds trie树合并
D. Acyclic Organic Compounds You are given a tree T with n vertices (numbered 1 through n) and a l ...
- Codeforces 615C Running Track(DP + Trie树)
题目大概说给两个串,问最少要用多少个第一个串的子串(可以翻转)拼成第二个串. UVa1401,一个道理..dp[i]表示前缀i拼接成功所需最少的子串,利用第一个串所有子串建立的Trie树往前枚举转移. ...
- Codeforces 861D - Polycarp's phone book 【Trie树】
<题目链接> 题目大意: 输入7e4个长度为9的字符串,每个字符串中只出现0~9这几种数字,现在需要你输出每个母串中最短的特有子串. 解题分析: 利用Trie树进行公共子串的判定,因为Tr ...
- Codeforces 633C Spy Syndrome 2 【Trie树】+【DFS】
<题目链接> 题目大意:给定一个只有小写字母组成的目标串和m个模式串(里面可能有大写字母),记目标串反过来后的串为S,让你从m个模式串中选出若干个组成S串(不区分大小写).输出任意一种方案 ...
- Codeforces 514C Watto and Mechanism 【Trie树】+【DFS】
<题目链接> 题目大意:输入n个单词构成单词库,然后进行m次查询,每次查询输入一个单词(注意这些单词只由a,b,c构成),问该单词库中是否存在与当前查询的单词有且仅有一个字符不同的单词. ...
- CodeForces - 778C: Peterson Polyglot (启发式合并trie树)
Peterson loves to learn new languages, but his favorite hobby is making new ones. Language is a set ...
随机推荐
- Swift 学习- 01 -- 基础部分
print("世界,你好") var myVariable = 42 myVariable = 50 let myConstant = 42 let implicitinteger ...
- Ubuntu16.04配置Tomcat的80端口访问
[问题描述] 在阿里云 ECS 服务器 Ubuntu16.04 下部署 Java Web 应用时,发现配置的 Tomcat 服务启动后 80 端口无法被监听. [问题原因] 出现该问题的主要原因是:非 ...
- UINavigationController 、navigationBar 、 UINavigationItem、UIBarButtonItem之间的关系
- 洛谷P2014 选课
首先分析题目,这是一道树形dp的题目,是树形背包类的问题,以为每门课的先修课只有一门,所以这一定可以 构成一个森林结构,于是我们可以设计一个虚拟的根节点作为森林的根. 状态转移方程如下 dp[v][k ...
- LeetCode(117):填充同一层的兄弟节点 II
Medium! 题目描述: 给定一个二叉树 struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *n ...
- laravel 迁移枚举
$table->enum('type', ['replace', 'warning'])->comment('类型');
- hiho1460 rmq模板题
好久没做rmq的题了,今天写了一遍,感觉打表有点像区间dp /* 给定长为n的字符串,要求在字符串中选择k个字符, 选择的子系列字典序最小 因为选择k个字符,那么就是去掉n-k个字符 那么[1,n-k ...
- 20165314 学习基础和C语言基础调查
技能学习心得 你有什么技能比大多人(超过90%以上)更好?针对这个技能的获取你有什么成功的经验?与老师博客中的学习经验有什么共通之处? 从小我的父母就逼着我学习很多技能,比如钢琴,围棋,书法等,不过很 ...
- node.js 的热更新
1.安装 npm i supervisor -gd 2.运行 supervisor server.js //server.js 是你自己的服务的js文件
- Jmeter测试demo
复制代码,保存为.jmx文件 需要安装插件: JMeterPlugins-ExtrasLibs E:\软件\apache-jmeter-3.0\lib\ext <?xml version=&qu ...