#include<iostream>
using namespace std;
/*
字典树 / 前缀树 / 单词查找树
插入 / 查询
*/
int trie[100][26];//100个节点,trie[i][j]表示:i号节点指向的存储字符('a' + j)的节点编号
int nodeCnt = 0;//记录节点编号
//插入
void insert(char str[], int l) {
int cur = 0;//入口始终是0号节点
for (int i = 0; i < l; i++) {
//入口没有连接存储字符str[i]的节点,就分配一个新节点
if (!trie[cur][str[i] - 'a']) {
trie[cur][str[i] - 'a'] = ++nodeCnt;
}
cur = trie[cur][str[i] - 'a'];
}
}
//查询是否存在
bool search(char str[], int l) {
int cur = 0;
for (int i = 0; i < l; i++) {
//没有连接存储字符str[i]的节点就返回false,否则继续查询下一个字符
if (!(cur = trie[cur][str[i] - 'a'])) return false;
}
return true;
}
int main() {
int m, n;
char str[100];
cin >> m >> n;
for (int i = 0; i < m; i++) {
cin >> str;
int l = strlen(str);
insert(str, l);
}
for (int i = 0; i < n; i++) {
cin >> str;
int l = strlen(str);
if (search(str, l)) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}
字典树(前缀树、单词查找树)
最新推荐文章于 2023-02-07 21:33:32 发布