把字符串挂到Trie树上,对于需要查询的一个字符串str,在Trie上进行深搜找到一个字符串,满足条件
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Node{
int end;
Node *p[3];
};
char str[600005];
Node *NewNode(){
Node *m = new Node();
memset(m, 0, sizeof(Node));
return m;
}
void Insert(Node *root){
Node *h = root;
for(int i = 0; str[i]; i++){
int d = str[i] - 'a';
if(h -> p[d] == 0)
h -> p[d] = NewNode();
h = h -> p[d];
}
h -> end = 1;
}
bool Query(Node *h, int k, int j){
if(str[j] == 0){
if(h -> end == 1 && k == 1)
return true;
return false;
}
int d = str[j] - 'a';
for(int i = 0; i < 3; i++){
if(h -> p[i]){
if(i == d && Query(h -> p[i], k, j+1))
return true;
if(i != d && k == 0 && Query(h -> p[i], k+1, j+1))
return true;
}
}
return false;
}
void Delete(Node *h){
for(int i = 0; i < 3; i++){
if(h -> p[i])
Delete(h -> p[i]);
}
free(h);
}
int main(){
//freopen("in.txt", "r", stdin);
Node *root = NewNode();
int n, m;
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i++){
scanf("%s", str);
Insert(root);
}
for(int i = 0; i < m; i++){
scanf("%s", str);
if(Query(root, 0, 0))
puts("YES");
else
puts("NO");
}
Delete(root);
return 0;
}