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

    统计难题

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)
    Total Submission(s): 27876    Accepted Submission(s): 11120


    Problem Description
    Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
     
    Input
    输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.

    注意:本题只有一组测试数据,处理到文件结束.
     
    Output
    对于每个提问,给出以该字符串为前缀的单词的数量.
     
    Sample Input
    banana
    band
    bee
    absolute acm
     
    ba
    b
    band
    abc
     
    Sample Output
    2
    3
    1
    0
    静态建树:
    #include"cstdio"
    #include"cstring"
    #include"cstdlib"
    using namespace std;
    const int MAXN=500005;
    const int N=26;
    struct Node{
        int t;
        Node *next[N];
        Node()
        {
            t=0;
            for(int i=0;i<N;i++)    next[i]=NULL;
        }
    };
    Node memory[MAXN];
    int ant;
    Node *root;
    void Insert(char s[])
    {
        Node *p=root;
        for(int i=0;s[i];i++)
        {
            int k=s[i]-'a';
            if(p->next[k]==NULL)    p->next[k]=&memory[ant++];
            p=p->next[k];
            p->t++;
        }
    }
    int Search(char s[])
    {
        Node *p=root;
        for(int i=0;s[i];i++)
        {
            int k=s[i]-'a';
            if(p->next[k]==NULL)    return 0;
            p=p->next[k];
        }
        return p->t;
    }
    int main()
    {
        char s[15];
        memset(memory,0,sizeof(memory));
        root=&memory[ant++];
        while(gets(s)&&*s)
        {
            Insert(s);
        }
        while(scanf("%s",s)!=EOF)
        {
            printf("%d
    ",Search(s));    
        }
        
        return 0;
    }

    动态建树:

    #include"cstdio"
    #include"cstring"
    using namespace std;
    const int N=26;
    struct node{
        int t;
        node* next[N];
        node()
        {
            t=0;
            for(int i=0;i<N;i++)    next[i]=NULL;
        }
    };
    node* root;
    
    void insert(char *s)
    {
        node* p=root;
        for(int i=0;s[i];i++)
        {
            int k=s[i]-'a';
            if(p->next[k]==NULL)    p->next[k]=new node();
            p=p->next[k];
            p->t++;
        }
    }
    
    int search(char *s)
    {
        node *p=root;
        int i;
        for(i=0;s[i];i++)
        {
            int k=s[i]-'a';
            if(p->next[k]==NULL)    return 0;
            p=p->next[k];
        }
        return p->t;
    }
    void del(node* p)//递归释放内存
    {
        for(int i=0;i<N;i++)
        {
            if(p->next[i]!=NULL)
            {
                del(p->next[i]);
            }        
        }
        delete p;
    }
    int main()
    {
        char s[15];
        root=new node();
        while(gets(s)&&*s)
        {
            insert(s);
        }
        while(gets(s))
        {
            printf("%d
    ",search(s));
        }
        del(root);
        return 0;
    }
  • 相关阅读:
    IDEA的JDBC报错解决
    java注解
    Java反射
    javaIO
    工程师的认知
    前端的一些性能提升
    ES6函数的扩展
    2020新年愿望
    高维护性的javascript
    Chrome Dev tools的几点小技巧
  • 原文地址:https://www.cnblogs.com/program-ccc/p/5120110.html
Copyright © 2011-2022 走看看