# HDU 1251统计难题（字典树）

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
• 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
• 2014年06月19日 14:16
• 585

## Hdu-1251 统计难题

• niushuai666
• 2011年09月20日 18:28
• 1516

## hdu 1251 统计难题 (map水过)

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

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

• aaaaacmer
• 2016年07月25日 20:59
• 422

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

• qq_29600137
• 2016年05月14日 16:42
• 498

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

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

## HDU 1251 统计难题-字典树

• Holyang_1013197377
• 2015年07月21日 21:34
• 396

## 字典树 HDU 1251 统计难题

• u012349402
• 2014年07月09日 09:26
• 281

## 统计难题 HDU - 1251 （字典树）

Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input 输入数据的...
• Coldfresh
• 2017年09月18日 17:53
• 179

举报原因： 您举报文章：HDU 1251统计难题（字典树） 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)