Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
Input
输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.
注意:本题只有一组测试数据,处理到文件结束.
Output
对于每个提问,给出以该字符串为前缀的单词的数量.
Sample Input
banana
band
bee
absolute
acm
ba
b
band
abcSample Output
建立一个字典树,每个节点中得n为个数, 每次到这个节点明说这个深度的单词已经出现一次, n++, 统计完之后,则直接查询,可以减少搜索的操作;
#include <cstdio>
#include <cstring>
using namespace std;

struct node
{
int n;
int child[26];
};
node trie[500000];


int main()
{
memset(trie, 0, sizeof(trie));
char word[15];
int n = 1;

while(gets(word),word[0])
{
int p = 0;

for (int i = 0; i<strlen(word);i++)
{

if (trie[p].child[word[i]-'a'] == 0)
{
trie[p].child[word[i]-'a'] = n++; //可以理解为malloc,不过这里已经开辟了一堆素组,是从数组里取
}
p = trie[p].child[word[i]-'a'];
trie[p].n++;
}
}

while (gets(word))
{
int p = 0;
int flag = 1;

for (int i = 0; i < strlen(word); i++)
{

if (trie[p].child[word[i]-'a'] == 0)
{ //这里的判断是为了不然p重新为0 而造成回到第一个节点。
flag = 0;
break;
}
p = trie[p].child[word[i]-'a'];

}

if (flag == 0)
{
printf("0\n");
}
else
printf("%d\n", trie[p].n);
}
return 0;
}
