# [置顶] HDU 1251统计难题（字典树）

1559人阅读 评论(0)

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


18
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：192355次
• 积分：3705
• 等级：
• 排名：第8724名
• 原创：103篇
• 转载：12篇
• 译文：0篇
• 评论：58条
文章分类
阅读排行
最新评论
友情链接