#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
const int maxn = 1000;
const int l = 30;
// 用数组来模拟字典树
int trie[maxn][l];
// 记录每个字符串的终点位置
int ans[maxn];
// 建立树
void insert_(char *s){
int k = 1;
int p = 0;
int l = strlen(s);
for(int i =0 ;i<l;i++){
int c = s[i] - 'a';
// 如果无此节点
if(!trie[p][c]){
trie[p][c] = k;
k++;
}
// 记录当前节点的编号, 按照循环, p 最后的值就是当前字符串最后一个字符在字典树中的节点编号数 。
p = trie[p][c];
}
// 记录终点。
ans[p] = 1;
}
// 搜索树
int search_(char *s){
int l = strlen(s);
int p = 0;
for(int i=0;i<l;i++){
// 开始遍历树,
int c = s[i] - 'a';
// 有值的话, trie[p][c] 对应的就是该字符串的字符下标
// 如果没有这个节点 ,结束
if(!trie[p][c]) return 0;
// 更新 p (当前字符串的下标)
p = trie[p][c];
// 如此遍历, 最后 p 的位置就当前字符串终点的位置, 直接判断字典树中该位置是否是终点就行了。
}
return ans[p] == 1;
}
int main(){
int t,q;
cin>>t>>q;
char str[20];
// 建树
while(t--){
cin>>str;
insert_(str);
}
while(q--){
cin>>str;
if(search_(str)) cout<<"YES"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
字典树 c++
最新推荐文章于 2024-07-02 22:54:24 发布