用字典树解决,渣渣不熟悉字典树,写在这里以后多看看。。。。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#pragma comment (linker,"/STACK:102400000,102400000")
#define maxn 601005
#define MAXN 3
#define mod 1000000009
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-6
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
typedef long long ll;
using namespace std;
typedef struct TrieNode
{
int nCount; //标记该结点是否是某个字符串的结尾
struct TrieNode *next[MAXN];
}TrieNode;
char s[maxn];
int n,m;
TrieNode *proot;
TrieNode *CreateTrieNode()
{
TrieNode *p;
p=(TrieNode *)malloc(sizeof(TrieNode));
p->nCount=0;
for (int i=0;i<3;i++)
p->next[i]=NULL;
return p;
}
void Trie_insert(char *s) //建字典树
{
TrieNode *p;
p=proot;
if (!p)
p=proot=CreateTrieNode();
int i=0;
while (s[i])
{
int k=s[i++]-'a';
if (!p->next[k])
p->next[k]=CreateTrieNode();
p=p->next[k];
}
p->nCount=1;
}
bool dfs(TrieNode *root,int len,int flag) //dfs搜索
{
if (s[len])
{
int k=s[len]-'a';
if (root->next[k]!=NULL)
{
if (dfs(root->next[k],len+1,flag))
return true;
}
if (!flag)
{
for (int i=0;i<3;i++)
if (i!=k&&root->next[i]!=NULL)
if (dfs(root->next[i],len+1,++flag))
return true;
}
}
else
{
if (flag&&root->nCount==1)
return true;
}
return false;
}
int main()
{
while (~scanf("%d%d",&n,&m))
{
proot=NULL;
for (int i=0;i<n;i++)
{
scanf("%s",s);
Trie_insert(s);
}
for (int i=0;i<m;i++)
{
scanf("%s",s);
if (dfs(proot,0,0)) printf("YES\n");
else printf("NO\n");
}
}
return 0;
}