#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N = 3e6 + 10;
int tr[N][26 + 26 + 10 + 1];
int tot;
int f[N];
char s[100000 + 10];
//边是字符
int id(char c)
{
if (c >= 'A' && c <= 'Z')
{
return c - 'A' + 1;
}
if (c >= 'a' && c <= 'z')
{
return c - 'a' +26 + 1;
}
return c - '0' + 26 + 26 + 1;
}
void dfs(int k)
{
for (int i = 1; i <= 26 + 26 + 10; i++)
{
if (tr[k][i])
{
dfs(tr[k][i]);
f[k] += f[tr[k][i]];
}
}
}
int main()
{
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int T;
cin >> T;
while (T--)
{
tot = 1;
int n, q;
cin >> n >> q;
while (n--)
{
cin >> s + 1;
int k = 1;//根
int len = strlen(s + 1);
for (int i = 1; i <= len; i++)
{
int t = id(s[i]);
if (tr[k][t] == 0)
{
tr[k][t] = ++tot;
}
k = tr[k][t];
}
++f[k];//结束单词
}
dfs(1);
while (q--)
{
cin >> s + 1;
int len = strlen(s + 1);
int k = 1;
for (int i = 1; i <= len; i++)
{
int t = id(s[i]);
k = tr[k][t];
}
cout << f[k] << '\n';
}
for (int i = 1; i <= tot; i++)
{
f[i] = 0;
for (int j = 1; j <= 26 + 26 + 10; j++)
{
tr[i][j] = 0;
}
}
}
return 0;
}