#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+5;
int trie[N][26], cnt[N];
char str[N];
int n, m, idx;
void insert(char str[]){
int p = 0 ;
for(int i = 0; str[i]; i++){
int u = str[i] - 'a';
if(!trie[p][u]) trie[p][u] = ++idx; // 这层没有这个字母
p = trie[p][u]; //到下一层
}
cnt[p]++;//统计个数
}
int search(char str[]){
int p = 0, ans = 0;
for(int i = 0; str[i]; i++){
int u = str[i] - 'a';
if(!trie[p][u]) return ans ; //这个存的单词已经没了
ans += cnt[trie[p][u]]; //已这个字母结尾的个数
p = trie[p][u]; //下一层
}
return ans ;
}
int main(){
cin>> n >> m;
for(int i = 1; i <= n; i++){
cin>>str;
insert(str);
}
for(int i = 1; i <= m; i++){
cin >> str;
cout<<search(str)<<endl;
}
return 0;
}
注:for(int i = 0; str[i]; i++)
C++中字符结尾会默认存储`\0’,故可以用此来表示有没有空