#include <iostream>
#include <iomanip>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <tuple>
#include <string>
#include <cstring>
#include <queue>
#include <stack>
#include <numeric>
using namespace std;
#define endl "\n"
#define int long long
const int N = 2e6 + 10;
const int mod = 1e9 + 7;
int n,m;
char str[30];
char ssr[N];
struct Trie{
bool exist;
int next[26];
int len;
}a[1000];
int top = 1;
void Trie_insert(){
int num = 0,root = 1;
int cnt = 0;
for(int i = 0; str[i]; ++i){
num = str[i] - 'a';
if(!a[root].next[num])a[root].next[num] = ++top;
root = a[root].next[num];
cnt++;
}
a[root].exist = true;
a[root].len = cnt;
}
int Trie_search(){
int num = 0,root = 1;
int res = 0;
int temp = 0;
for(int i = 0 ; ssr[i]; ++ i){
num = ssr[i] - 'a';
if(a[root].exist && (a[root].next[num])){
bool vis = false;
for(int j = i + 1; ssr[j]; ++ j){
if(a[root].exist)vis = true;
if(!a[root].next[num] && !vis){
res += temp;
temp = 0;
root = 1;
break;
}
}
}else if(a[root].exist){
res += temp;
temp = 0;
root = 1;
}
if(!a[root].next[num])break;
root = a[root].next[num];
temp++;
}
if(a[root].exist){
res += temp;
temp = 0;
root = 1;
}
return res;
}
void solve(){
cin >> n >> m;
for(int i = 1; i <= n ; i ++){
memset(str , 0 , sizeof str);
cin >> str;
Trie_insert();
}
for(int i = 1; i <= m ; i ++){
memset(ssr , 0 , sizeof ssr);
cin >> ssr;
cout << Trie_search() << endl;
}
}
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T;
T = 1;
//cin >> T;
while(T--)solve();
return 0;
}
想知道 哪个点没想到