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 统计难题(字典树)

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others) Total Subm...

hdu 1251 统计难题 字典树入门

所谓字典树,就是Trie树,很容易理解,为什么叫字典树,就想查字典一样,查一个英文单词,则从第一个字母开始查,然后第二个,第三个。。。直到遍历完整个单词。  它的优点是:利用字符串的公...

HDU 1251 统计难题(字典树)

 Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自...

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

J - 统计难题 Time Limit:2000MS     Memory Limit:65535KB     64bit IO Format:%I64d & %I64u Submit Sta...

HDU-1251 统计难题,字典树或者map!

统计难题      很久就看过这个题了,但不会~~~不会~~      题意:给出一张单词表,然后下面有若干查询,每次给出一个单词,问单词表中是否存在以这个单词为前缀的单词,输出数量。本身也是自身的...

HDU 1251 统计难题(字典树)

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others) Total Su...

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

/* nxt[i]中记录该节点中下个节点是否存在'a'+i,v记录该节点出现的次数 */ #include #include const int maxn = 1e6 + 5; struct node...

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

字典树:定义: 字典树(Trie树)是一种树形数据结构,其作用是存储多个字符串,并可以自动按照字典序排好。该算法的时间复杂度为O(n),空间复杂度为O(nk),其中n为所有字符串的和,k为所有可能出...
  • FeBr2
  • FeBr2
  • 2016年07月15日 16:40
  • 339

【HDU 1251】统计难题(字典树入门题)

统计难题Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)Problem Desc...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU 1251统计难题(字典树)
举报原因:
原因补充:

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