时间限制: 1 s
空间限制: 256000 KB
题目等级 : 大师 Master
题解
Description
最经,skyzhong得到了一本好厉害的字典,这个字典里整整有n个单词(1<=n<=200000)
现在skyzhong需要在字典里查询以某一段字母开头的单词
如:skyzhong想查询a
那么只要是a开头的单词就可以了
skyzhong只想知道里面有没有这一个单词(因为没有他就不查了)
若有,请输出YES。若没有,请输出NO
Input Description
第一行一个数n
第二行到第n+1行,一行一个字符串
再下一行一个数m,表示skyzhong想要查询的次数
接着m行,一行一个字符串,表示skyzhong想要查的东西
Output Description
共m行,若有这字串输出YES,否则输出NO
Sample Input
3
asd
asfdghj
asfd
3
asd
asdghj
asf
Sample Output
YES
NO
YES
数据范围及提示 Data Size & Hint
字符串只有小写字母,且长度≤8
题目链接:codevs 4189 字典
题解:字典树模板题
AC的C语言代码:
#include<stdio.h>
#include<string.h>
#define N 600005
int trie[N][26];
int tot;
void insert(char *s,int rt)
{
int i;
for(i=0;s[i];i++){
int x=s[i]-'a';
if(!trie[rt][x])
trie[rt][x]=++tot;
rt=trie[rt][x];
}
}
int find(char *s)
{
int i,rt=0;
for(i=0;s[i];i++){
int x=s[i]-'a';
if(!trie[rt][x])
return 0;
rt=trie[rt][x];
}
return 1;
}
int main()
{
int n,m;
char s[20];
tot=0;
scanf("%d",&n);
while(n--){
scanf("%s",s);
insert(s,0);
}
scanf("%d",&m);
while(m--){
scanf("%s",s);
if(find(s))
printf("YES\n");
else
printf("NO\n");
}
return 0;
}