HDU 1251 字典树应用: 统计给定字符串为前缀的单词的数量 http://acm.hdu.edu.cn/showproblem.php?pid=1251
又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
struct Tire
{
int count;
struct Tire *tire[26];
}*a;
void init()
{
a = new Tire;
for(int i = 0; i < 26; i++)
a->tire[i] = NULL;
}
void insert(char ch[])
{
int length = strlen(ch);
int k;
Tire *head = a;
for(int i = 0; i < length; i++)
{
k = (int)(ch[i]-97);
if(head->tire[k] != NULL)
{
head = head->tire[k];
head->count++;
}
else
{
head->tire[k] = new Tire;
head = head->tire[k];
head->count = 1;
for(int j = 0; j < 26; j++)
head->tire[j] = NULL;
}
}
}
int find(char cal[])
{
int len = strlen(cal);
int k;
Tire *newhead = a;
for(int i = 0; i < len; i++)
{
k = (int)(cal[i]-97);
if(newhead->tire[k] != NULL)
newhead = newhead->tire[k];
else
return 0;
}
return newhead->count;
}
int main()
{
char s[10], ss[10];
init();
int len,num=0;
while(gets(s)) //gets可以接收空格;而scanf遇到空格、回车和Tab键都会认为输入结束,所有它不能接收空格。
{
len = strlen(s);
if(len == 0)
break;
insert(s);
}
while(gets(ss))
{
num = 0;
num = find(ss);
printf("%d\n", num);
}
}