题目描述 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
1 #include <algorithm> 2 #include <cstring> 3 #include <cstdio> 4 5 using namespace std; 6 7 int tot,n; 8 char s[11]; 9 struct Trie 10 { 11 int next[27]; 12 }tr[3000000]; 13 inline void Trie_build() 14 { 15 int now=0,len=strlen(s); 16 for(int x,i=0;i<len;i++) 17 { 18 x=s[i]-'a'; 19 if(tr[now].next[x]) 20 now=tr[now].next[x]; 21 else 22 { 23 tr[now].next[x]=++tot; 24 now=tot; 25 } 26 } 27 } 28 inline bool Trie_find() 29 { 30 int len=strlen(s); 31 int now=0,p=0; 32 for(;p<len;) 33 if(tr[now].next[s[p]-'a']) 34 now=tr[now].next[s[p]-'a'],p++; 35 else return 0; 36 return 1; 37 } 38 39 int main() 40 { 41 scanf("%d",&n); 42 for(int i=1;i<=n;i++) 43 { 44 scanf("%s",s); 45 Trie_build(); 46 memset(s,0,sizeof(s)); 47 } 48 scanf("%d",&n); 49 for(int i=1;i<=n;i++) 50 { 51 scanf("%s",s); 52 if(Trie_find()) printf("YES "); 53 else printf("NO "); 54 memset(s,0,sizeof(s)); 55 } 56 return 0; 57 }