将单词表中所有单词建立一棵字典树,再利用 (cnt)数组统计字典树中以每个字母结尾的字符串的个数。因此,在接下来的多次询问中,只需要返回单词最后一个字母对应的(cnt)数组值即可。
const int N=5e5+10;
int trie[N][26],cnt[N],idx;
void insert(string word)
{
int p=0;
for(int i=0;i<word.size();i++)
{
int k=word[i]-'a';
if(!trie[p][k]) trie[p][k]=++idx;
p=trie[p][k];
cnt[p]++;
}
}
int query(string word)
{
int p=0;
for(int i=0;i<word.size();i++)
{
int k=word[i]-'a';
p=trie[p][k];
if(!p) return 0;
}
return cnt[p];
}
int main()
{
string word;
while(getline(cin,word))
{
if(word.size() == 0) break;
insert(word);
}
while(getline(cin,word))
cout<<query(word)<<endl;
//system("pause");
return 0;
}