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;
    }
  • 相关阅读:
    toj 2975 Encription
    poj 1797 Heavy Transportation
    toj 2971 Rotating Numbers
    zoj 2281 Way to Freedom
    toj 2483 Nasty Hacks
    toj 2972 MOVING DHAKA
    toj 2696 Collecting Beepers
    toj 2970 Hackle Number
    toj 2485 Card Tric
    js页面定位,相关几个属性
  • 原文地址:https://www.cnblogs.com/program-ccc/p/5120110.html
Copyright © 2011-2022 走看看