大致题意:给出一些单词,再给出一些字符串,问对每个提问给出以该字符串为前缀的单词的数量
测试案例:
input:
banana
band
bee
absolute
acm
ba
b
band
abc
output:
2
3
1
0
解题思路:这题使用Trie树可以解,很简单,在Trie节点那存一个num值表示到这个字母为止以其为前缀的单词个数
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct Trie
{
int num;
Trie* next[26];
Trie()
{
num=0;
for (int i=0;i<26;i++)
{
next[i]=NULL;
}
}
};
Trie *tree=new Trie();
void Insert(char word[])
{
Trie* p=tree;
int i;
for (i=0;word[i];i++)
{
int t=word[i]-'a';
if (p->next[t]==NULL)
{
p->next[t]=new Trie();
}
p=p->next[t];
p->num++;
}
}
int getnum(char word[])
{
Trie* p=tree;
for (int i=0;word[i];i++)
{
int t=word[i]-'a';
if (p->next[t]!=NULL)
{
p=p->next[t];
}
else
return 0;
}
return p->num;
}
void freetree(Trie *p)
{
for (int i=0;i<26;i++)
{
if (p->next[i]!=NULL)
{
freetree(p->next[i]);
}
}
delete(p);
}
int main()
{
char s[11];
while (gets(s))
{
if (s[0]=='\0')
break;
Insert(s);
}
while (gets(s))
{
int ans=getnum(s);
printf("%d\n",ans);
}
freetree(tree);
return 0;
}