Codeforces 514C Watto and Mechanism(字典树)
题目链接 Watto and Mechanism
题意 给出$n$个串(相当于字典),然后给出$m$个询问。
每个询问以字符串的形式给出,你需要改变这个字符串中的任意一个字符
(必须改变且只能改变一个)
如果改变之后可以成为$n$个串中的一个字符串,则输出$YES$, 否则输出$NO$。
字母集合为$\left\{ a, b, c \right\}$
考虑字典树。
首先把$n$个单词插入字典树中。
询问的时候用$dfs$,$flag$表示搜索到当前是否已经改变过一个字符。
如果已经改变过那只能按照当前剩下的字符串一条路查询下去。
否则可以按老字符或新字符进行查询。
(这题很卡内存)
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) const int N = 2e7 + 3; char s[600010];
int n, q, ans, len, tot = 0;
int ch[N][3];
bitset <N> cnt; int newnode(){
++tot;
rep(i, 0, 2) ch[tot][i] = 0;
cnt[tot] = 0;
return tot;
} void insert(char* s){
int now = 0;
for (int i = 0; s[i]; ++i){
int w = s[i] - 'a';
if (!ch[now][w]) ch[now][w] = newnode();
now = ch[now][w];
}
cnt[now] = 1;
} void dfs(int x, int flag, int now){
if (ans) return;
if (x == len && flag && cnt[now]){ ans = 1; return;}
if (x >= len) return;
if (flag){
int w = s[x] - 'a';
if (ch[now][w]) dfs(x + 1, flag, ch[now][w]);
} else{
rep(i, 0, 2)
if (i != s[x] - 'a' && x + 1 == len && ch[now][i] && cnt[ch[now][i]]) ans = 1; rep(i, 0, 2) if (i != s[x] - 'a' && ch[now][i]){
dfs(x + 1, 1, ch[now][i]);
} int w = s[x] - 'a';
if (ch[now][w]){
dfs(x + 1, flag, ch[now][w]);
} }
} int main(){ scanf("%d%d", &n, &q);
rep(i, 1, n){
scanf("%s", s);
insert(s);
} rep(i, 1, q){
scanf("%s", s);
len = strlen(s);
ans = 0;
dfs(0, 0, 0);
puts(ans ? "YES" : "NO");
} return 0;
}
Codeforces 514C Watto and Mechanism(字典树)的更多相关文章
- 【codeforces 514C】Watto and Mechanism(字典树做法)
[题目链接]:http://codeforces.com/contest/514/problem/C [题意] 给你n个字符串; 然后给你m个询问;->m个字符串 对于每一个询问字符串 你需要在 ...
- Codeforces Round #291 (Div. 2) C. Watto and Mechanism [字典树]
传送门 C. Watto and Mechanism time limit per test 3 seconds memory limit per test 256 megabytes input s ...
- CF Watto and Mechanism (字典树+深搜)
Watto and Mechanism time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- Codeforces 514C Watto and Mechanism 【Trie树】+【DFS】
<题目链接> 题目大意:输入n个单词构成单词库,然后进行m次查询,每次查询输入一个单词(注意这些单词只由a,b,c构成),问该单词库中是否存在与当前查询的单词有且仅有一个字符不同的单词. ...
- codeforces gym #101161F-Dictionary Game(字典树+树上删边游戏)
题目链接: http://codeforces.com/gym/101161/attachments 题意: 给一个可以变化的字典树 在字典树上删边 如果某条边和根节点不连通那么这条边也删除 谁没得删 ...
- CodeForces 706D Vasiliy's Multiset (字典树查询+贪心)
题意:最开始的时候有一个集合,集合里面只有一个元素0,现在有q次操作,操作分为3种: + x: 表示向集合中添加一个元素x - x:表示删除集合中值为x的一个元素 ? x:表示查询集合中与x异或的最大 ...
- Codeforces 577E Ann and Half-Palindrome 字典树
题目链接 题意: 若一个字符串是半回文串.则满足第一位和最后一位相等, 第三位和倒数第三位相等.如此类推. 给定一个字符串s,输出s的全部子串中的半回文串字典序第k大的 字符串. good[i][j] ...
- Watto and Mechanism CodeForces - 514C (字典树,哈希)
大意: 给定字符串集$S$, 每次询问给出字符串$a$, 求$S$中是否存在一个字符串恰好与$a$相差一个字符. 直接建字典树暴力复杂度是$O(n\sqrt{n})$, 也可以用set维护所有哈希值, ...
- codeforces 706D (字典树)
题目链接:http://codeforces.com/problemset/problem/706/D 题意:q次操作,可以向多重集中增添,删除,询问异或最大值. 思路:转化为二进制用字典树存储,数字 ...
随机推荐
- 第1节 flume:15、flume案例二,通过自定义拦截器实现数据的脱敏
1.7.flume案例二 案例需求: 在数据采集之后,通过flume的拦截器,实现不需要的数据过滤掉,并将指定的第一个字段进行加密,加密之后再往hdfs上面保存 原始数据与处理之后的数据对比 图一 ...
- Delphi 中内存映射对于大文件的使用
这篇文章主要介绍了Delphi 中内存映射对于大文件的使用的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下 Delphi 中内存映射对于大文件的使用 平时很少使用大文件的内存映射,碰巧遇到了 ...
- C#在透明窗体WinForm上面画图(电子尺小工具的实现)
前几天要做一个微信调一调的外挂,里面用到了尺子测量距离,然后就自己下载了一个电子尺,最近要升级我的跳一跳外挂,然后就准备自己做一个电子尺,嵌入到我的外挂里面,在嵌入到我的外挂之前,我自己做了一个完整版 ...
- webuploader项目中多图片上传实例
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- NOIP 模拟题
目录 T1 : grid T2 : ling T3 : threebody 数据可私信我. T1 : grid 题目:在一个\(n*n\)的方格中,你只能斜着走.为了让问题更简单,你还有一次上下左右走 ...
- 条款37:绝不重新定义继承而来的缺省参数值(Never redefine a function's inherited default parameter value)
NOTE: 1.绝不重新定义一个继承而来的缺省参数值,因为缺省参数值都是静态绑定的,而virtual 函数-----你唯一应该覆盖的东西----却是动态绑定的.
- 【java】抽象类继承关系
抽象类: 抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充. 一个类不能同时被 abstract 和 final 修饰.如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将 ...
- (转)编写高质量的OC代码
点标记语法 属性和幂等方法(多次调用和一次调用返回的结果相同)使用点标记语法访问,其他的情况使用方括号标记语法. 良好的风格: view.backgroundColor = [UIColor or ...
- 不同深度的图片转换cvConvertScale
不同深度图像的转换:要注意范围比如IPL_DEPTH_8U 转到 IPL_DEPTH_32U要用cvConvertScale(pImg8, pImg32, 1.0/255, 0); 要除255反过来I ...
- stm32开发套件选择——LL SPL HAL Snippets的应用范围