码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 1251 统计难题 (Trie树)

时间:2014-11-28 06:17:45      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   os   sp   for   

本题是trie树模板题,如果不用trie而用map写可以看出trie处理这类问题有明显的时间优势。
在trie树中查找一个关键字的时间和树中包含的结点数无关,而取决于组成关键字的字符数。(对比:二叉查找树的查找时间和树中的结点数有关O(log2n)。)
如果要查找的关键字可以分解成字符序列且不是很长,利用trie树查找速度优于二叉查找树。
若关键字长度最大是5,则利用trie树,利用5次比较可以从265=11881376个可能的关键字中检索出指定的关键字。而利用二叉查找树至少要进行log2265=23.5次比较。
bubuko.com,布布扣
//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]!=\0))
    {
        create_trie(str);
    }
    while(scanf("%s",str)!=EOF)
    {
        printf("%d\n",find_trie(str));
    }
    return 0;
}
trie树实现
bubuko.com,布布扣
//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] = \0;
            m[str]++;
        }
    }
    while( gets(str) )
    {
        cout << m[str] << endl;
    }
    
    return 0;
}
map实现

 

 

hdu 1251 统计难题 (Trie树)

标签:style   blog   http   io   ar   color   os   sp   for   

原文地址:http://www.cnblogs.com/zywscq/p/4127602.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!