zoukankan      html  css  js  c++  java
  • Codevs 4189 字典(字典树Trie)

    4189 字典
    时间限制: 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

    /*
    字典树模板(前缀查询).
    查询某个单词的前缀是否出现过
    因为当查询如字符串abc是否为某个字符串的前缀时,
    显然以b、c、d....等不是以a开头的字符串就不用查找了,
    这样迅速缩小查找的范围和提高查找的针对性。
    所以建立Trie的复杂度为O(n*len),
    而建立+查询在trie中是可以同时执行的,
    建立的过程也就可以成为查询的过程,
    hash就不能实现这个功能. 
    所以总的复杂度为O(n*len),
    实际查询的复杂度只是O(len). 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define MAXN 300001
    #define MAXM 1001
    using namespace std;
    char s[MAXM];
    struct data
    {
    int next[27];//next是一个指针数组,存放着指向各个孩子结点的指针
    bool b;
    }tree[MAXN];
    int m,n,tot;
    void Add_vertex()
    {
    int l=strlen(s);
    int now=0;
    for(int i=0;i<l;i++)
    {
    int x=s[i]-'a'+1;
    if(tree[now].next[x])
     now=tree[now].next[x];
    else
    {
    tot++;
    tree[now].next[x]=tot;
    now=tot;
    }  
    }
    tree[now].b=true;
    }
    int find()
    {
    int l=strlen(s);
    int now=0,p=0,sum=0;
    while(p<l)
    {
    if(tree[now].next[s[p]-'a'+1])
    {
    now=tree[now].next[s[p]-'a'+1];
    p++;
    continue;
    }
    return 0;
    }
    return 1;
    }
    int main()
    {
    cin>>n;
    for(int i=1;i<=n;i++)
     {
      cin>>s;
      Add_vertex();
     }
    cin>>m;
    memset(s,0,sizeof(s));
    for(int i=1;i<=m;i++)
    {
    cin>>s;
    int jd=find();
    if(jd) cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
    }
    return 0;
    }
  • 相关阅读:
    袁绍的刁难(recruitment.pas/cpp)
    数列分块入门 5 总结
    【五校联考3day1】旅游
    【五校联考3day1】食物
    jzoj 1274. 游历的路线(lines.pas/cpp)
    thinkphp框架开发功能要求
    java中 Bouncycastal库的使用
    Spring+Quartz实现定时任务的配置方法
    java缓存的使用
    Java注解教程:自定义注解示例,利用反射进行解析
  • 原文地址:https://www.cnblogs.com/nancheng58/p/6070818.html
Copyright © 2011-2022 走看看