HDU 1251统计难题(字典树)

原创 2012年03月22日 08:11:37

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251

经典的字典树题目。。

字典树:又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。

AC code:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct node 
{
    int count;
    struct node *next[26];
};
struct node *root;
void insert(char *s)/*建立字典树*/  
{
    int i,j,len;
	struct node *current,*newset;/*current相当于移动的指针,newset代表新建节点*/  
    len=strlen(s);
    if(len==0) return ;
    current=root;
    for(i=0;i<len;i++)
    {
        if(current->next[s[i]-'a']!=NULL)/*如果前缀以前出现过*/  
        {
            current=current->next[s[i]-'a'];
            current->count=current->count+1;/*count代表当前字符或字符串出现的次数*/  
        }
        else
        {
			struct node *newset=(struct node *)malloc(sizeof(struct node));/*如果前缀没有出现过,则需要新建节点*/  
            for(j=0;j<26;j++)
            {
               newset->next[j]=NULL; 
            }
            current->next[s[i]-'a']=newset;
            current=newset;
            current->count=1;
        }
    }
}
int find(char *s)/*定义查找字符串*/  
{
    int i,len;
    struct node *current;
    len=strlen(s);
    if(len==0) return 0;
    current=root;
    for(i=0;i<len;i++)
    {
        if(current->next[s[i]-'a']!=NULL)
        {
            current=current->next[s[i]-'a'];
        }
        else
        {
            return 0;
        }
    }
    return current->count;
}
int main()
{
    char str[101];
    int i,ans;
    root=(struct node *)malloc(sizeof(struct node));
	for(i=0;i<26;i++)
	{
		root->next[i]=NULL;
	}
    while(gets(str)&&str[0]!='\0')
    {
        insert(str);
    }
    while(~scanf("%s",str))
    {
        ans=find(str);
        printf("%d\n",ans);
    }
    return 0;
}

又写了一段差不多的,不过看起来跟美观了~~~哈哈

AC code:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct node 
{
    int count;
    struct node *next[26];
};
struct node *root;
struct node *newset()/*实现建立节点功能*/
{
    struct node *current;
    current=(struct node *)malloc(sizeof(struct node));
    for(int i=0;i<26;i++)
    {
        current->next[i]=NULL;
    }
    current->count=1;
    return current;
}
void insert(char *s)/*实现建立字典树功能*/
{
    struct node *current;
    int len=strlen(s);
    if(len==0) return ;
    current=root;
    for(int i=0;i<len;i++)
    {
        if(current->next[s[i]-'a']!=NULL)
        {
            current=current->next[s[i]-'a'];
            current->count=current->count+1;
        }
        else
        {
            current->next[s[i]-'a']=newset();
            current=current->next[s[i]-'a'];
        }
    }
}
int find(char *s)/*实现查找功能*/
{
    struct node *current;
    int len=strlen(s);
    if(len==0) return 0;
    current=root;
    for(int i=0;i<len;i++)
    {
        if(current->next[s[i]-'a']!=NULL)
        {
            current=current->next[s[i]-'a'];
        }
        else
        {
            return 0;
        }
    }
    return current->count;
}
int main()
{
    char str[101];
    int i,ans;
    root=newset();
    while(gets(str)&&str[0]!='\0')
    {
        insert(str);
    }
    while(~scanf("%s",str))
    {
        ans=find(str);
        printf("%d\n",ans);
    }
    return 0;
}



HDU-1251-统计难题

HDU-1251-统计难题 http://acm.hdu.edu.cn/showproblem.php?pid=1251 基本的字典树,字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希...
  • Cambridgeacm
  • Cambridgeacm
  • 2012年07月16日 16:55
  • 4793

【字典树模板(数组实现)】HDU 1251 统计难题

#include #include #define NODE 1000005 int next[NODE][26]; int v[NODE]; int node; void init(){ ...
  • u011695464
  • u011695464
  • 2014年06月19日 14:16
  • 585

Hdu-1251 统计难题

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251 解题思路: 字典树的典型应用——插入,查询。 1.插入时候,不是字母结束时将head->c...
  • niushuai666
  • niushuai666
  • 2011年09月20日 18:28
  • 1516

hdu 1251 统计难题 (map水过)

# include # include # include # include # include using namespace std; int main() { char a;...
  • lp_opai
  • lp_opai
  • 2014年08月15日 21:59
  • 703

hdu1251 统计难题(Trie树入门题)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1075 Trie树的入门题。 代码: #include #include const int max...
  • aaaaacmer
  • aaaaacmer
  • 2016年07月25日 20:59
  • 422

HDOJ 1251-统计难题【模板:字典树】

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others) Total Su...
  • qq_29600137
  • qq_29600137
  • 2016年05月14日 16:42
  • 498

[HDU 1251] 统计难题(字典树)

#include #include #include #include #include using namespace std; struct Node{ int num; ...
  • u013539441
  • u013539441
  • 2014年11月09日 15:55
  • 266

HDU 1251 统计难题-字典树

友情题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1251 基础字典树: #include #include char s[15]; struct...
  • Holyang_1013197377
  • Holyang_1013197377
  • 2015年07月21日 21:34
  • 396

字典树 HDU 1251 统计难题

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others) Total Su...
  • u012349402
  • u012349402
  • 2014年07月09日 09:26
  • 281

统计难题 HDU - 1251 (字典树)

Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input 输入数据的...
  • Coldfresh
  • Coldfresh
  • 2017年09月18日 17:53
  • 179
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU 1251统计难题(字典树)
举报原因:
原因补充:

(最多只允许输入30个字)