【枚举+trie+dfs】CF514 C

Problem - 514C - Codeforces

题意:

思路:

其实是trie上dfs的板题

先把字符串插入到字典树中

对于每次询问,都去字典树上dfs

注意到字符集只有3,因此如果发现有不同的字符,去枚举新的字符

Code:

cpp 复制代码
#include <bits/stdc++.h>

using i64 = long long;

using namespace std;

const int N = 4e5 + 10;
const int M = 3e6 + 10;
const int P = 131;

string s;

int tot = 0;
int tag[N];
int tr[N][30];

void insert(string x) {
	int p = 0;
	for (int i = 0; i < x.size(); i ++) {
		int u = x[i] - 'a';
		if (! tr[p][u]) {
			tr[p][u] = ++tot;
		}
		p = tr[p][u];
	}
	tag[p] = 1;
}
bool dfs(int dep, int u, int num) {
	if (s[dep]) {
		int v = s[dep] - 'a';
		if (tr[u][v]) {
			if (dfs(dep + 1, tr[u][v], num)) return true;
		}
		if (!num) {
			for (int j = 0; j < 3; j ++) {
				if (j != v && tr[u][j]) {
					if (dfs(dep + 1, tr[u][j], num + 1)) return true;
				}
			}
		}
	}
	else if (tag[u] && num) return true;
	return false;
}
void solve() {
	int n,m;
	cin >> n >> m;

	for (int i = 1; i <= n; i ++) {
		cin >> s;
		insert(s);
	}

	for (int i = 1; i <= m; i ++) {
		cin >> s;
		if (dfs(0, 0, 0)) {
			cout << "YES" << "\n";
		}else {
			cout << "NO" << "\n";
		}
	}
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	int t = 1;
	//cin >> t;
	while(t --) {
		solve();
	}
	return 0;
}
相关推荐
qyzm18 小时前
天梯赛练习(3月13日)
开发语言·数据结构·python·算法·贪心算法
逆境不可逃19 小时前
LeetCode 热题 100 之 64. 最小路径和 5. 最长回文子串 1143. 最长公共子序列 72. 编辑距离
算法·leetcode·动态规划
CoderCodingNo19 小时前
【GESP】C++五级练习题 luogu-P1182 数列分段 Section II
开发语言·c++·算法
放下华子我只抽RuiKe519 小时前
机器学习全景指南-直觉篇——基于距离的 K-近邻 (KNN) 算法
人工智能·gpt·算法·机器学习·语言模型·chatgpt·ai编程
kisshuan1239619 小时前
[特殊字符]【深度学习】DA3METRIC-LARGE单目深度估计算法详解
人工智能·深度学习·算法
sali-tec20 小时前
C# 基于OpenCv的视觉工作流-章33-Blod分析
图像处理·人工智能·opencv·算法·计算机视觉
Eward-an20 小时前
LeetCode 239. 滑动窗口最大值(详细技术解析)
python·算法·leetcode
一叶落43820 小时前
LeetCode 50. Pow(x, n)(快速幂详解 | C语言实现)
c语言·算法·leetcode
皙然21 小时前
彻底吃透红黑树
数据结构·算法
t1987512821 小时前
TOA定位算法MATLAB实现(二维三维场景)
开发语言·算法·matlab