字典

题目描述 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<cstdio>
 2 #include<cstring>
 3 #define k j+ch[i]-'a'
 4 int n,m,l,ws;
 5 char ch[30];
 6 int w[30000000];
 7 void put(int l){
 8     for(int i=0,j=0;i<l;i++){
 9         if(!w[k]) w[k]=ws,ws+=26;
10         j=w[k];
11     }
12 }
13 bool search(int l){
14     for(int i=0,j=0;i<l;i++)
15     if(!w[k]) return false;
16     else j=w[k];
17     return true;
18 }
19 int main(){
20     ws=26;
21     scanf("%d",&n);
22     for(int i=1;i<=n;i++){
23         scanf("%s",ch);
24         put(strlen(ch));
25     }
26     scanf("%d",&m);
27     for(int i=1;i<=m;i++){
28         scanf("%s",ch);
29         if(search(strlen(ch))) printf("YES
");
30         else printf("NO
");
31     }
32     return 0;
33 }

这就是个裸题,

不过,我的思路好像整体上都挺优的。

去年六月的师傅 100 670ms 28 MB C++ 1010B 2016/06/13 9:02:21
100 367ms 29 MB C++ 561B 2017/03/23 19:58:14

好吧,没有什么可高兴的。

然而,这份代码应该是错误的,每一个单词的子串都会被判断为存在在字典中。

正确的代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #define k j+ch[i]-'a'
 4 int n,m,l,ws;
 5 char ch[30];
 6 int w[10000000];
 7 bool v[10000000];
 8 void put(int l){
 9     for(int i=0,j=0;i<l;i++){
10         if(!w[k]) w[k]=ws,ws+=26;
11         j=w[k];
12         if(i==l-1) v[j]=1;
13     }
14 }
15 bool search(int l){
16     for(int i=0,j=0;i<l;i++){
17         if(!w[k]) return false;
18         j=w[k];
19         if(v[j]) return true;
20     }
21 }
22 int main(){
23     ws=26;
24     scanf("%d",&n);
25     for(int i=1;i<=n;i++){
26         scanf("%s",ch);
27         put(strlen(ch));
28     }
29     scanf("%d",&m);
30     for(int i=1;i<=m;i++){
31         scanf("%s",ch);
32         if(search(strlen(ch))) printf("YES
");
33         else printf("NO
");
34     }
35     return 0;
36 }

题目来源:CODE[VS]

原文地址:https://www.cnblogs.com/J-william/p/6607068.html