#include <bits/stdc++.h>
using namespace std;
const int N = 3e6+5;
int T,n,tree[N][63],q,tot,mp[N];
string s[100005];
void insert(string s){
int u = 0;
for(int i=0;i<s.size();i++){
int v = 0;
if(s[i]>='a' && s[i]<='z')v=s[i]-'a';
if(s[i]>='A' && s[i]<='Z')v=s[i]-'A'+26;
if(s[i]>='0' && s[i]<='9')v=s[i]-'0'+52;
int c = tree[u][v];
if(!c)tree[u][v]=++tot;
u = tree[u][v];
mp[u]++;
}
}
int find(string s){
int u = 0;
for(int i=0;i<s.size();i++){
int v = 0;
if(s[i]>='a' && s[i]<='z')v=s[i]-'a';
if(s[i]>='A' && s[i]<='Z')v=s[i]-'A'+26;
if(s[i]>='0' && s[i]<='9')v=s[i]-'0'+52;
if(tree[u][v]==0)return 0;
u = tree[u][v];
}
return mp[u];
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>T;
while(T--){
for(int i=0;i<tot;i++){
mp[i] = 0;
for(int j=0;j<=62;j++){
tree[i][j] = 0;
}
}
tot = 0;
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>s[i];
insert(s[i]);
}
while(q--){
string s;
cin>>s;
cout<<find(s)<<endl;
}
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 4e6+5;
int tree[N][2],n,a[100005],tot,mp[N];
void insert(int x){
int u = 0;
for(int j=31;j>=0;j--){
int v = (x>>(j-1))&1;
int c = tree[u][v];
if(!c)tree[u][v]=++tot;
u = tree[u][v];
}
mp[u] = x;
}
int find(int x){
int u = 0;
for(int j=31;j>=0;j--){
int v = (x>>(j-1))&1;
int c = tree[u][v^1];
if(!c)u = tree[u][v];
else u = c;
}
return x^mp[u];
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
insert(a[i]);
}
int res = 0;
for(int i=1;i<=n;i++){
res = max(res,find(a[i]));
}
cout<<res<<endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
#define int long long
struct node{
int v,w;
};
vector<node>e[N];
int sum[N],n,tot;
int tree[N*32+5][2],mp[N*32];
void dfs(int x,int fa){
for(auto [v,w]:e[x]){
if(v==fa)continue;
sum[v] = sum[x]^w;
dfs(v,x);
}
}
void insert(int x){
int u = 0;
for(int j=31;j>=1;j--){
int v = (x>>(j-1))&1;
int c = tree[u][v];
if(!c)tree[u][v]=++tot;
u = tree[u][v];
}
mp[u] = x;
}
int find(int x){
int u = 0;
for(int j=31;j>=1;j--){
int v = (x>>(j-1))&1;
int c = tree[u][v^1];
if(!c)u=tree[u][v];
else u = tree[u][v^1];
}
return mp[u]^x;
}
signed main(){
cin>>n;
for(int i=1;i<n;i++){
int x,y,z;
cin>>x>>y>>z;
e[x].push_back({y,z});
e[y].push_back({x,z});
}
dfs(1,0);
for(int i=1;i<=n;i++){
insert(sum[i]);
}
int res = 0;
for(int i=1;i<=n;i++){
res = max(res,find(sum[i]));
}
cout<<res<<endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 151*71;
struct node{
int son[26],fail;
}tree[N];
int n,tot,mp[N],vis[N],T[N];
string s[N];
void insert(string s,int id){
int u = 0;
for(int i=0;i<s.size();i++){
int v= s[i]-'a';
int c = tree[u].son[v];
if(!c)tree[u].son[v] = ++tot;
u = tree[u].son[v];
}
vis[u] = 1;
T[id] = u;
}
void GetFail(){
queue<int>q;
for(int i=0;i<26;i++){
int c = tree[0].son[i];
if(c){
q.push(c);
tree[c].fail = 0;
}
}
while(!q.empty()){
int u = q.front();
q.pop();
int fa = tree[u].fail;
for(int v=0;v<26;v++){
int c = tree[u].son[v];
if(c){
q.push(c);
tree[c].fail = tree[fa].son[v];
}
else tree[u].son[v] = tree[fa].son[v];
}
}
}
void find(string str){
int u = 0;
for(int i=0;i<str.size();i++){
int v = str[i]-'a';
int c = tree[u].son[v];
while(c){
mp[c]++;
c = tree[c].fail;
}
u = tree[u].son[v];
}
int res = 0;
for(int i=1;i<=n;i++){
if(mp[T[i]]>res){
res = mp[T[i]];
}
}
cout<<res<<endl;
for(int i=1;i<=n;i++){
if(mp[T[i]]==res){
cout<<s[i]<<endl;
}
}
}
int main(){
while(cin>>n){
if(!n)return 0;
for(int i=0;i<=tot;i++){
tree[i].fail = 0;
mp[i] = 0;
for(int j=0;j<26;j++){
tree[i].son[j] = 0;
}
}
tot = 0;
for(int i=1;i<=n;i++){
cin>>s[i];
insert(s[i],i);
}
GetFail();
string str;
cin>>str;
find(str);
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 2e6+5;
struct node{
int son[27],fail;
}tree[N];
int n,tot,mp[N],in[N],f[N];
string s[N];
void insert(string s,int id){
int u = 0;
for(int i=0;i<s.size();i++){
int v = s[i]-'a';
int c = tree[u].son[v];
if(!c)tree[u].son[v] = ++tot;
u = tree[u].son[v];
}
mp[id] = u;
}
void GetFail(){
queue<int>q;
for(int i=0;i<26;i++){
int c=tree[0].son[i];
if(c){
q.push(c);
tree[c].fail = 0;
}
}
while(!q.empty()){
int u = q.front();
q.pop();
int fa = tree[u].fail;
for(int v=0;v<26;v++){
int c = tree[u].son[v];
if(c){
q.push(c);
tree[c].fail = tree[fa].son[v];
in[tree[fa].son[v]]++;
}
else tree[u].son[v] = tree[fa].son[v];
}
}
}
void find(string s){
int u = 0;
for(int i=0;i<s.size();i++){
int v = s[i]-'a';
int c = tree[u].son[v];
f[c]++;
u = tree[u].son[v];
}
}
void topsort(){
queue<int>q;
for(int i=1;i<=tot;i++){
if(in[i]==0)q.push(i);
}
while(!q.empty()){
int u = q.front();q.pop();
int v = tree[u].fail;
in[v]--;
if(in[v]==0)q.push(v);
f[v]+=f[u];
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>s[i];
insert(s[i],i);
}
GetFail();
string str;
cin>>str;
find(str);
topsort();
for(int i=1;i<=n;i++){
cout<<f[mp[i]]<<endl;
}
return 0;
}