HDU1251统计难题---Trie Tree

map巧过

#include <stdio.h>
#include <string.h>
#include <map>
#include <string>
using namespace std;
map<string,int>m1;
int main()
{
    char z[10];
    while(gets(z))
    {
        if(strlen(z)==0)
            break;
        for(int i=strlen(z);i>0;i--)
        {
            z[i]=‘\0‘;
            m1[z]++;
        }
    }
    while(gets(z))
    {
        printf("%d\n",m1[z]);
    }
    return 0;
}

经典字典树(前缀树)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;

struct node
{
    int Count;///以此节点为前缀的单词数
    node *next[26];///26叉树
    node() ///初始化数据
    {
        for (int i=0;i<26;i++)
            next[i]=NULL;
        Count=0;
    }
};

node *p,*root=new node();
void Insert(char *s)///插入新单词,即建立字典树
{
    int i,k;
    p=root;
    for (i=0; s[i]!=‘\0‘; i++)
    {
        k=s[i]-‘a‘;
        if (p->next[k]==NULL)
            p->next[k]=new node();
    ///判断是不是新节点,如果是分配创建一个新节点来存贮 ,
    ///即root的next域对应的k位置是否为空
        p=p->next[k];///向前走一步
        p->Count++; ///以此位置为前缀的数量+1
    }
}

int Search(char *s)
{
    int i,k;
    p=root;
    for (i=0; s[i]!=‘\0‘; i++)
    {
        k=s[i]-‘a‘;
        if (p->next[k]==NULL)///一旦查找不到,立即跳出
            return 0;
        p=p->next[k];
    }
    return p->Count;
}

int main()
{
    char s[11];
    while (gets(s))
    {
        int len=strlen(s);
        if (len==0)
            break;
        Insert(s);
    }
    while (gets(s))
    {
        printf("%d\n",Search(s));
    }
    return 0;
}

第一个字典树(G++内存超限),第二个map(红黑树),对于此类问题,字典树效率优势明显

时间: 2024-10-09 21:39:30

HDU1251统计难题---Trie Tree的相关文章

[hdu1251]统计难题(trie模板题)

题意:返回字典中所有以测试串为前缀的字符串总数. 解题关键:trie模板题,由AC自动机的板子稍加改造而来. #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> #include<queue> using namespace std; typedef long

HDU1251 统计难题 【trie树】

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others) Total Submission(s): 17302    Accepted Submission(s): 7464 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的

hdu1251(统计难题)

这题就是一个字典树的模板题 统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others) Total Submission(s): 16997    Accepted Submission(s): 7318 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的

HDU 1251 统计难题 Trie题解

基本上是标准的寻找前缀的问题,只需要insert和search函数就可以了. 我这里主要是修改一下n的记录方法,这里的n代表的不是叶子节点的标志,而是有多少单词经过了这条路径的标志. 然后是查找需要查找的前缀单词,如果没有找到,就返回0,表示没有单词以这个前缀单词为前缀,如果找到,直接返回n就是答案了.因为有n个单词经过了这条路径. 查找效率是常数. 使用静态分配空间的办法. #include <stdio.h> #include <string.h> const int MAX_

hdu1251统计难题(trie)

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submission(s): 41046    Accepted Submission(s): 14830 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的

HDU1251 统计难题(Trie)

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others) Total Submission(s): 26574    Accepted Submission(s): 10760 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己

HDU-1251 统计难题(Trie、AC自动机)

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submission(s): 44119    Accepted Submission(s): 15817 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的

hdu1251 统计难题

地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=1251 题目: 统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submission(s): 35141    Accepted Submission(s): 13175 Problem Description Ignatius最近遇到一个难题,老师交给

hdu1251统计难题【字典树】

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others) Total Submission(s): 18759    Accepted Submission(s): 8289 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的