题目来源:
http://hihocoder.com/problemset/problem/1014
里面有字典树的建立过程,可以参考。
#include<cstdio>
struct trie //利用结构体来封装字典树的节点。
{
trie* next[27];
int num;
trie()
//构造函数。
{
for(int i=0; i<26; i++)
next[i]=NULL;
num=0;
}
} root;
void insert(char* s) //将字符串s所表示的单词插入到字典树中。
{
trie *p=&root;
for(int i=0; s[i]!='\0'; i++)
{
if(p->next[s[i]-'a']==NULL)
p->next[s[i]-'a']=new trie;
p=p->next[s[i]-'a'];
p->num++;
}
}
int find(char *s) //返回值是以s为前缀的单词的数量。
{
trie *p=&root;
for(int i=0; s[i]!='\0'; i++)
if(p->next[s[i]-'a']==NULL)
return 0;
else
p=p->next[s[i]-'a'];
return p->num;
}
int main()
{
char str[100010];
int n;
scanf("%d",&n);
getchar();
while(n--)
{
gets(str);
insert(str);
}
int m;
scanf("%d",&m);
while(m--)
{
scanf("%s",str);
printf("%d\n",find(str));
}
}
样例输入:
5
babaab
babbbaaaa
abba
aaaaabaa
babaababb
5
babb
baabaaa
bab
bb
bbabbaab
样例输出:
1
0
3
0
0