输入数据的第一部分是一张单词表,每行一个单词,一个空行代表单词表的结束。第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串。对于每个提问,给出以该字符串为前缀的单词的数量.
Sample Input
banana band bee absolute acm
ba b band abc
Sample Output
2 3 1 0
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int maxn=1e6+10;
int trie[maxn][26];
//数组形式定义字典树,值存储的是下一个字符的位置
int num[maxn]={0};
//附加值,以某一字符串为前缀的单词的数量
int pos=1;
void insert(char s[])//在字典树中插入单词s
{
int c=0;
for(int i=0;s[i];i++)
{
int n=s[i]-'a';
if(trie[c][n]==0)//如果对应字符还没有值
trie[c][n]=pos++;
c=trie[c][n];
num[c]++;
}
}
int find(char s[])//返回以某个字符串为前缀的单词的数量
{
int c=0;
for(int i=0;s[i];i++)
{
int n=s[i]-'a';
if(trie[c][n]==0)
return 0;
c=trie[c][n];
}
return num[c];
}
int main(){
char s[20];
while(gets(s))
{
if(strlen(s)==0)
break;
insert(s);
}
while(~scanf("%s",s))
{
printf("%d\n",find(s));
}
return 0;
}