zoukankan      html  css  js  c++  java
  • hdu 1251 统计难题 (Trie树)

    本题是trie树模板题,如果不用trie而用map写可以看出trie处理这类问题有明显的时间优势。
    在trie树中查找一个关键字的时间和树中包含的结点数无关,而取决于组成关键字的字符数。(对比:二叉查找树的查找时间和树中的结点数有关O(log2n)。)
    如果要查找的关键字可以分解成字符序列且不是很长,利用trie树查找速度优于二叉查找树。
    若关键字长度最大是5,则利用trie树,利用5次比较可以从265=11881376个可能的关键字中检索出指定的关键字。而利用二叉查找树至少要进行log2265=23.5次比较。
    //125ms
    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<map>
    #include<set>
    #include<vector>
    #include<algorithm>
    #include<stack>
    #include<queue>
    #include<cctype>
    #include<sstream>
    using namespace std;
    #define pii pair<int,int>
    #define LL long long int
    const int eps=1e-8;
    const int INF=1000000000;
    const int maxn=1;
    struct trie
    {
        trie *child[26];
        int v;
    };
    trie root;
    void create_trie(char *ss)
    {
        int len=strlen(ss);
        trie *p=&root,*q;
        for(int i=0;i<len;i++)
        {
            int id=ss[i]-'a';
            if(p->child[id]==NULL)
            {
                q=(trie*)malloc(sizeof(trie));
                q->v=1;
                for(int j=0;j<26;j++)
                {
                    q->child[j]=NULL;
                }
                p->child[id]=q;
                p=p->child[id];
            }
            else
            {
                p->child[id]->v++;
                p=p->child[id];
            }
        }
    }
    int find_trie(char*ss)
    {
        int len=strlen(ss);
        trie *p=&root;
        for(int i=0;i<len;i++)
        {
            int id=ss[i]-'a';
            if(p->child[id]==NULL) return 0;
            p=p->child[id];
        }
        return p->v;
    }
    int main()
    {
        //freopen("in8.txt","r",stdin);
        char str[15];
        while(gets(str)&&(str[0]!=''))
        {
            create_trie(str);
        }
        while(scanf("%s",str)!=EOF)
        {
            printf("%d
    ",find_trie(str));
        }
        return 0;
    }
    trie树实现
    //1171ms
    #include <iostream>
    #include <map>
    #include <cstring>
    #include <string>
    using namespace std;
    
    int main()
    {
        int i, len;
        char str[10];
        
        map<string, int> m;
        while( gets(str) )
        {
            len = strlen(str);
            if ( !len )
            {
                break;
            }
            for(i = len; i > 0; i--)
            {
                str[i] = '';
                m[str]++;
            }
        }
        while( gets(str) )
        {
            cout << m[str] << endl;
        }
        
        return 0;
    }
    map实现
     
  • 相关阅读:
    发现一个奇怪的问题: 不能把文件取名为 con
    博客园新购服务器硬件配置
    [重要新功能]团队Blog
    [庆祝]博客园已迁至新服务器
    [公告]博客园论坛开放注册
    博客园出现了奇怪的cookie问题
    [公告]博客园聊天室试运行
    [重发]请为你喜欢的博客园杂志的名字投上一票
    [征询意见]准备采用“创作共用”协议保护大家的原创作品
    博客园期刊制作小组Blog开通
  • 原文地址:https://www.cnblogs.com/zywscq/p/4127602.html
Copyright © 2011-2022 走看看