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;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

hdu1251统计难题+字典树

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

hdu1251 统计难题 (字典树查找)

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

hdu 1251 统计难题(字典树)

字典树 #include #include #include //构造字典树,26叉树,根结点为空 typedef struct node{ node *child[26];/...

hdu 1251 统计难题 (字典树)

题目链接:   hdu 1251 题目大意:   给出单词的词典,然后有限次询问                   每次询问给出的字符在词典中作为前缀的次数 ...

hdu 1251 统计难题 字典树水题

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

HDU1251 统计难题 解题报告--字典树

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

hdu 1251 统计难题 字典树

传送门:hdu1251统计难题 中文题目不做过多的解释解题思路已经接近于字典树的模板题目,每次把字典中的单词加入到树里面。 先是要创建这棵树, 1. 线定义结构体,先看我们定义的结构体typed...

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

HDU 1251 统计难题(字典树Trie) http://acm.hdu.edu.cn/showproblem.php?pid=1251 题意:给你多个单词,然后在给你一个字符串s,现在要问你以该字...

hdu1251 统计难题 字典树插入,查询模板和空间释放

字典树插入,查询模板和空间释放 #include #include #include using namespace std; struct trienode { int ncount;//该...

HDU 1251 统计难题 (字典树)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251 题面: 统计难题 Time Limit: 4000/2000 MS (Ja...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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