zoukankan      html  css  js  c++  java
  • hihocoder 1014(字典树)

    1014 : Trie树

    题意:

      给出n个字符串和m个询问,每个询问为一个字符串,问该字符串是给出的n个字符串中多少个字符串的前缀?

    分析:

      字典树的入门题。

      学习资料:大佬博客

    代码:

    数组写法

    #include <map>
    #include <queue>
    #include <math.h>
    #include <string>
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    #define ll long long
    #define ull unsigned long long
    #define cls(x) memset(x,0,sizeof(x))
    #define clslow(x) memset(x,-1,sizeof(x))
    
    const int wordLen=10;
    const int maxn=1e5+100;
    
    int n,m,rt,tot;
    
    int trie[maxn*wordLen][26],sum[maxn*wordLen];
    
    void Insert(char* s,int rt)
    {
        int len=strlen(s);
        for(int i=0;i<len;i++){
            int x=s[i]-'a';
            if(trie[rt][x]==0){
                trie[rt][x]=++tot;
                sum[tot]=0;
            }
            rt=trie[rt][x];
            sum[rt]++;
        }
    }
    
    int Find(char* s,int rt)
    {
        int len=strlen(s);
        for(int i=0;i<len;i++){
            int x=s[i]-'a';
            if(trie[rt][x]==0){
                return 0;
            }
            rt=trie[rt][x];
        }
        return sum[rt];
    }
    
    int main()
    {
    //    freopen("in.txt","r",stdin);
        char s[26];
        while(scanf("%d",&n)!=EOF)
        {
            rt=tot=1;
            for(int i=1;i<=n;i++){
                scanf("%s",s);
                Insert(s,rt);
            }
            scanf("%d",&m);
            for(int i=1;i<=m;i++){
                scanf("%s",s);
                printf("%d
    ",Find(s,rt));
            }
        }
        return 0;
    }
    View Code

    指针写法

    #include <map>
    #include <queue>
    #include <math.h>
    #include <string>
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    #define ll long long
    #define ull unsigned long long
    #define cls(x) memset(x,0,sizeof(x))
    #define clslow(x) memset(x,-1,sizeof(x))
    
    const int maxn=1e5+100;
    
    struct TrieNode {
        int cnt;
        TrieNode* nex[26];
    };
    TrieNode* root;
    
    TrieNode* build()
    {
        TrieNode* node=new TrieNode;
        node->cnt=0;
        cls(node->nex);
        return node;
    }
    
    void Insert(char* s)
    {
        int len=strlen(s);
        TrieNode* node=root;
        for(int i=0;i<len;i++){
            int x=s[i]-'a';
            if(node->nex[x]==NULL){
                node->nex[x]=build();
            }
            node=node->nex[x];
            node->cnt++;
        }
    }
    
    int Find(char* s)
    {
        int len=strlen(s);
        TrieNode* node=root;
        for(int i=0;i<len;i++){
            int x=s[i]-'a';
            if(node->nex[x]==NULL){
                return 0;
            }
            node=node->nex[x];
        }
        return node->cnt;
    }
    
    void del(TrieNode* node)
    {
        for(int i=0;i<26;i++){
            if(node->nex[i]!=NULL){
                del(node->nex[i]);
            }
        }
        free(node);
    }
    
    int main()
    {
    //    freopen("in.txt","r",stdin);
        int n,m;
        char s[26];
        while(scanf("%d",&n)!=EOF)
        {
            root=build();
            for(int i=1;i<=n;i++){
                scanf("%s",s);
                Insert(s);
            }
            scanf("%d",&m);
            for(int i=1;i<=m;i++){
                scanf("%s",s);
                printf("%d
    ",Find(s));
            }
            del(root);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    Ubuntu安装Apache
    【C#设计模式——创建型模式】抽象工厂模式
    【C#设计模式——创建型模式】工场方法模式
    【C#设计模式——创建型模式】简单工场模式
    JS判断是不是Decimal类型(正则实现)
    JS实现给页面表单设置触发默认按钮
    记录ASP.NET页面表单初始状态(主要是为了前台可以根据这个判断页面是否变动了)
    Js触发ASP.NET Validation控件的验证, 同时获取前台验证结果(不包括CustomValidator)
    根据字段名查找表名
    SqlServer判断数据库、表、存储过程、函数是否存在
  • 原文地址:https://www.cnblogs.com/shutdown113/p/9394120.html
Copyright © 2011-2022 走看看