您的位置:首页 > 其它

HDU 1251(搜索题,典型的字典树问题)

2010-07-30 09:05 351 查看

统计难题

Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)
Total Submission(s): 4304 Accepted Submission(s): 1566


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

Input
输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.

注意:本题只有一组测试数据,处理到文件结束.

Output
对于每个提问,给出以该字符串为前缀的单词的数量.

Sample Input

banana
band
bee
absolute
acm

ba
b
band
abc


Sample Output

2
3
1
0 典型的字典树问题


#include <iostream>
using namespace std;

struct trie
{
trie *next[26];
int count;
};

trie *root;

trie* newtrie()
{
trie *t;
t=(trie*)malloc(sizeof(struct trie));
memset(t,0,sizeof(struct trie));
return t;
}

void insert(char *ch)
{
int i;
trie *t,*s;
s=root;
for(i=0;ch[i];i++)
{
if(s->next[ch[i]-'a'])
{
s=s->next[ch[i]-'a'];
s->count=s->count+1;
}
else
{
t=newtrie();
s->next[ch[i]-'a']=t;
s=t;
s->count=1;
}
}
}

int search(char *ch)
{
int i;
trie *s=root;
if(ch[0]==0) return 0;
for(i=0;ch[i];i++)
{
if(s->next[ch[i]-'a'])
{
s=s->next[ch[i]-'a'];
}
else
break;
}
if(ch[i]==0) return s->count;
else return 0;
}

int main()
{
char ch[12];
root=newtrie();
while (gets(ch))
{
if(strcmp(ch,"")!=0)
{
insert(ch);
}
else
break;
}
while (scanf("%s",ch)!=EOF)
{
printf("%d/n",search(ch));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: