#include "bits/stdc++.h"
#include<unordered_map>
#include<unordered_set>
#pragma warning(disable:4996)
using namespace std;
using ld =long double;
const ld eps = 1e-9;

int solve(const vector<string>&sts, const vector<string>&revsts, string st,const int k) {
	int ans=0;
	if (k == 0) {
		auto lt = lower_bound(sts.begin(), sts.end(), st);
		auto rt = upper_bound(sts.begin(), sts.end(), st);
		ans = rt - lt;
	}
	else if (k == 1) {
		auto lt = lower_bound(sts.begin(), sts.end(), st);
		st.back()++;
		auto rt = lower_bound(sts.begin(), sts.end(), st);
		ans = rt - lt;
	}
	else {
		string revst(st);
		reverse(revst.begin(), revst.end());
		auto lt = lower_bound(revsts.begin(), revsts.end(), revst);
		revst.back()++;
		auto rt = lower_bound(revsts.begin(), revsts.end(), revst);
		ans = rt - lt;
	}
	return ans;
}


int main()
{
	int N,Q;cin>>N>>Q;
	vector<string>sts,revsts;
	for (int i = 0; i < N; ++i) {
		string st;cin>>st;
		sts.push_back(st);
		reverse(st.begin(),st.end());
		revsts.push_back(st);
	}
	sort(sts.begin(),sts.end());
	sort(revsts.begin(),revsts.end());
	while (Q--) {
		string st;cin>>st;


		int k=0;
		if (st[0] == '*') {
			st=st.substr(1);
			k=2;
		}
		else if (st.back() == '*') {
			st=st.substr(0,st.size()-1);
			k=1;
		}

		int x=st.find('?');

		int ans=0;
		if (x == string::npos) {
			ans=solve(sts,revsts,st,k);
		}
		else {
			for (int c = 'a'; c <= 'z'; ++c) {
				st[x]=c;
				ans+=solve(sts,revsts,st,k);
			}
		}
		cout<<ans<<endl;
	}
	return 0;
}
