zoukankan      html  css  js  c++  java
  • 字典

    题目描述 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]

  • 相关阅读:
    有关云计算的思考
    转载:args build and execute command lines from standard input
    云计算时代来临
    How to check the service availble
    反射小结
    JOptionPane用法java
    eclipse快捷键调试总结
    javascript 控制 html元素 显示/隐藏
    "ORA00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效"的快速解决方法
    麻辣豆腐与编码
  • 原文地址:https://www.cnblogs.com/J-william/p/6607068.html
Copyright © 2011-2022 走看看