Codeforces 514C Watto and Mechanism(字典树)

题目链接  Watto and Mechanism

题意  给出n个串(相当于字典),然后给出m个询问。

每个询问以字符串的形式给出,你需要改变这个字符串中的任意一个字符

(必须改变且只能改变一个)

如果改变之后可以成为n个串中的一个字符串,则输出YES, 否则输出NO。

字母集合为{a, b, c}

考虑字典树。

首先把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;
}
时间: 2024-11-05 22:50:10

Codeforces 514C Watto and Mechanism(字典树)的相关文章

codeforces 514C Watto and Mechanism (分段暴力)

codeforces 514C Watto and Mechanism (分段暴力) 题意: 给出一个包含n个单词的字典,给出m个待查询单词,如果单词在有且仅有一个字符不相同的情况下可以在字典里找到,则输出YES,否则输出NO 限制: 0 <= n,m <= 3*10^5; 总字符长度不大于6*10^5 思路: 分段暴力. 以查询单词长度为500分段: 查询单词长度<500则:采用set查询,复杂度为600*500*500=1.5*10^8 查询单词长度>500则:暴力查询,复杂度

Codeforces 514C. Watto and Mechanism解题报告(字典树)

传送门 题意:给你一个字典和一些询问,问你对于每个询问的字符串必须更改一个字符,能否得到字典中的某一个单词. 思路:先构造一颗字典树,然后搜一遍就行了,要注意strlen不能每次都用,常数很大! #include<bits/stdc++.h> #define rep(i,k,n) for(int i=k;i<=n;i++) using namespace std; const int maxn=300005,maxm=600005; int tree[maxm][5],en[maxm];

C. Watto and Mechanism 字典树 Codeforces Round #291 (Div. 2)

C. Watto and Mechanism time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standard output Watto, the owner of a spare parts store, has recently got an order for the mechanism that can process strings in a ce

tries树第一题 codeforces 514C - Watto and Mechanism

题目链接 题意: 输入a个已知字符串和b个待检测字符串.问待检测字符串是否可以由某个已知字符串改变且只改变一个字母得到.可以输出YES,否则NO. 思路: 用trie树储存已知字符串.dfs改变一个字母看能否匹配. #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <string> using namespace std;

CodeForces 706D Vasiliy&#39;s Multiset (字典树查询+贪心)

题意:最开始的时候有一个集合,集合里面只有一个元素0,现在有q次操作,操作分为3种: + x: 表示向集合中添加一个元素x - x:表示删除集合中值为x的一个元素 ? x:表示查询集合中与x异或的最大值为多少 析:这是一个字典树的应用,不过确实没看出来....主要思想是这样,先用10进制数,转成二进制数,记下每个结点的0,1的个数,这样增加和删除,就是对01的删除, 剩下的就是查询,那么尽量让0和1XOR是最大的,所以,对于给定数,我们要去尽量他的XOR数,如果找到就加上,找不到,就找下一个.这

codeforces gym #101161F-Dictionary Game(字典树+树上删边游戏)

题目链接: http://codeforces.com/gym/101161/attachments 题意: 给一个可以变化的字典树 在字典树上删边 如果某条边和根节点不连通那么这条边也删除 谁没得删就输了 数据范围: $1\leq n \leq 100000$ $1\leq q \leq 100000$ $1\leq |s| \leq 40$ 分析: ac代码: #include<bits/stdc++.h> using namespace std; #define ll long long

Codeforces 577E Ann and Half-Palindrome 字典树

题目链接 题意: 若一个字符串是半回文串,则满足第一位和最后一位相等, 第三位和倒数第三位相等,如此类推. 给定一个字符串s,输出s的所有子串中的半回文串字典序第k大的 字符串. good[i][j] 表示 s(i,j) 是半回文串. 把这些回文串插到字典树里 在字典树上找第k个叶子节点. 插入时:插入以i点开头的所有半回文串. #include <iostream> #include <string> #include <vector> #include <cs

Codeforces 1285D Dr. Evil Underscores(字典树,dp)

传送门 题意: 有一个长度为 \(n\ (1\leq n\leq 10^5)\)的整数序列 \(a_1,\cdots,a_n\ \ (0\leq a_i\leq 2^{30}-1)\),你需要找到一个非负整数 \(X\) 使得 \(\max(a_i\oplus X)\)最小,其中 \(\oplus\) 为按位异或运算. 输入这个序列,输出\(\max(a_i\oplus X)\)的最小值. 思路: 1.数组中的每个数的二进制下的某位(第k位)都是0或者是1,那么x的第k位取值是0或者1,使得答案

CodeForces 518C - Watto and Mechanism(模拟)

题意:有n(1 <= n <= 10^5)个应用,每屏有k(1 <= k <= 10^5)个应用,现在有m(1 <= m <= 10^5)个操作,每次操作会使用一个应用(使用时需滑到应用所在的屏),使用后此应用与前边的相邻应用交换位置,退出此应用后会回到初始屏.问这m次操作总的滚动屏幕次数. 模拟即可. #include<cstdio> #include<cstring> #include<cctype> #include<cs