Loading

CODE[VS]4189 字典 (字典树模板题)

描述

传送门:我是传送门

最经,skyzhong得到了一本好厉害的字典,这个字典里整整有n个单词(1<=n<=200000)

现在skyzhong需要在字典里查询以某一段字母开头的单词

如:skyzhong想查询a

那么只要是a开头的单词就可以了

skyzhong只想知道里面有没有这一个单词(因为没有他就不查了)

若有,请输出YES。若没有,请输出NO

输入

第一行一个数n

第二行到第n+1行,一行一个字符串

再下一行一个数m,表示skyzhong想要查询的次数

接着m行,一行一个字符串,表示skyzhong想要查的东西

输出

共m行,若有这字串输出YES,否则输出NO

样例

输入

3

asd

asfdghj

asfd

3

asd

asdghj

asf

输出

YES

NO

YES

Note

字符串只有小写字母,且长度≤8

思路

字典树的模板题,恰好可以拿来练习字典树的使用

代码

 1 /*
 2  * =========================================================================
 3  *
 4  *       Filename:  p4189.cpp
 5  *
 6  *           Link:  http://codevs.cn/problem/4189/
 7  *
 8  *        Version:  1.0
 9  *        Created:  2018/08/29 10时31分33秒
10  *       Revision:  none
11  *       Compiler:  g++
12  *
13  *         Author:  杜宁元 (https://duny31030.top/), duny31030@126.com
14  *   Organization:  QLU_浪在ACM
15  *
16  * =========================================================================
17  */
18 #include <bits/stdc++.h>
19 using namespace std;
20 #define clr(a, x) memset(a, x, sizeof(a))
21 #define rep(i,a,n) for(int i=a;i<=n;i++)
22 #define pre(i,a,n) for(int i=a;i>=n;i--)
23 #define ll long long
24 #define max3(a,b,c) fmax(a,fmax(b,c))
25 #define ios ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
26 const double eps = 1e-6;
27 const int INF = 0x3f3f3f3f;
28 const int mod = 1e9 + 7;
29 const int N = 1000100;
30 
31 struct node
32 {
33     int next[27];
34 }trie[N];
35 char a[10];
36 int tot;
37 
38 void add()
39 {
40     int len = strlen(a);
41     int now = 0;
42     for(int i = 0;i < len;i++)
43     {
44         int tmp = a[i]-'a'+1;
45         int next = trie[now].next[tmp];
46         if(next)
47         {
48             now = next;
49         }
50         else 
51         {
52             trie[now].next[tmp] = ++tot;
53             now = tot;
54         }
55     }
56 }
57 
58 int query()
59 {
60     int len = strlen(a);
61     int now = 0,p = 0;
62     while(p < len)
63     {
64         int tmp = trie[now].next[a[p]-'a'+1];
65         if(!tmp)
66             return 0;
67         else 
68         {
69             now = tmp;
70             p++;
71         }
72     }
73     return 1;
74 }
75 
76 int main()
77 {
78     ios
79     int n,m;
80     cin >> n;
81     rep(i,1,n)
82     {
83         cin >> a;
84         add();
85     }
86     cin >> m;
87     rep(i,1,m)
88     {
89         cin >> a;
90         if(query())
91             printf("YES\n");
92         else 
93             printf("NO\n");
94 
95     }
96 
97     return 0;
98 }

 

posted @ 2021-01-20 18:12  Yiduuannng  阅读(117)  评论(0编辑  收藏  举报