字典树
题目描述
遇到单词不认识怎么办? 查字典啊,已知字典中有n个单词,假设单词都是由小写字母组成。现有m个不认识的单词,询问这m个单词是否出现在字典中。
输入
含有多组测试用例。
第一行输入n,m (n>=0&&n<=100000&&m>=0&&m<=100000)分别是字典中存在的n个单词和要查询的m个单词.
紧跟着n行,代表字典中存在的单词。
然后m行,要查询的m个单词
n=0&&m=0 程序结束
数据保证所有的单词都是有小写字母组成,并且长度不超过10
输出
若存在则输出Yes,不存在输出No .
示例输入
3 2 aab aa ad ac ad 0 0
示例输出
No Yes
#include <bits/stdc++.h>
using namespace std;
struct node
{
int mark;
int next[26];
} pp[500010];
int root,top;
char a[50],b[50];
int creat()
{
memset(pp[top].next,-1,sizeof(pp[top].next));
pp[top].mark=0;
return top++;
}
int xian(char c)
{
return c-'a';
}
void insert(int root,char *s)
{
int i;
int len =strlen(s);
for(i=0; i<len; i++)
{
if(pp[root].next[xian(s[i])]==-1)
pp[root].next[xian(s[i])]=creat();
root=pp[root].next[xian(s[i])];
}
pp[root].mark=1;
}
int search(int root,char *s)
{
int i;
int len=strlen(s);
for(i=0; i<len; i++)
{
if(pp[root].next[xian(s[i])]==-1)
return 0;
root=pp[root].next[xian(s[i])];
}
return pp[root].mark;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m)&&n&&m)
{
top=0;
root=creat();
for(int i=0; i<n; i++)
{
scanf("%s",a);
insert(root,a);
}
for(int i=0; i<m; i++)
{
scanf("%s",b);
if(search(root,b))
printf("Yes\n");
else printf("No\n");
}
}
}
<pre name="code" class="cpp">#include <bits/stdc++.h>
using namespace std;
struct node
{
int flag;
int next[26];
} sh[500005];
int a;
int creat()
{
memset(sh[a].next,0,sizeof(sh[a].next));
sh[a].flag=0;
return a++;
}
int insert(int root,char *str)
{
int i,len,t;
len=strlen(str);
for(i=0; i<len; i++)
{
t=str[i]-'a';
if(sh[root].next[t]==0)
sh[root].next[t]=creat();
root=sh[root].next[t];
}
return sh[root].flag=1;
}
int search(int root,char *str)
{
int i,len,t;
len=strlen(str);
for(i=0; i<len; i++)
{
t=str[i]-'a';
if(sh[root].next[t]==0)
return 0;
root=sh[root].next[t];
}
return sh[root].flag;
}
int main()
{
int n,m,i,root;
char str[10];
while(~scanf("%d%d",&n,&m))
{
if(n==0&&m==0)
break;
a=0;
root=creat();
for(i=0; i<n; i++)
{
scanf("%s",str);
insert(root,str);
}
for(i=0; i<m; i++)
{
scanf("%s",str);
if(search(root,str)==0)
printf("No\n");
else printf("Yes\n");
}
}
return 0;
}