#include <bits/stdc++.h>
using namespace std;
#define modulo 998244353
#define mod(mod_x) ((((long long)mod_x+modulo))%modulo)
#define Inf 1000000000

template <typename T>
struct trie{
	T init_value;
	struct node{
		vector<int> next;
		T v;
		T sum;
		int depth;
		node(int k,T iv,int d){
			next.resize(k,-1);
			v = iv;
			sum = iv;
			depth = d;
		}
		
		int link;
	};
	vector<node> _N;
	vector<string> _S;
	int n;
	trie(int k,T iv){
		init_value = iv;
		n = k;
		_N.push_back(node(n,init_value,0));
	}
	
	void add(string s,T x){
		int now = 0;
		for(int i=0;i<s.size();i++){
			int c = get(s[i]);
			if(_N[now].next[c]==-1){
				_N[now].next[c] = _N.size();
				_N.push_back(node(n,init_value,_N[now].depth+1));
			}
			now = _N[now].next[c];
		}
		
		_N[now].v = x;
		_S.push_back(s);
	}
	
	void set_link(){
		_N[0].link = 0;
		queue<int> Q;
		Q.push(0);
		while(Q.size()!=0){
			int now = Q.front();
			Q.pop();
			_N[now].v = func(_N[now].v,_N[_N[now].link].v);
			_N[now].sum = func(_N[now].sum,_N[now].v);
			for(int i=0;i<n;i++){
				int to = _N[now].next[i];
				if(to==-1)continue;
				int x = now;
				while(x!=0){
					x = _N[x].link;
					if(_N[x].next[i]!=-1){
						x = _N[x].next[i];
						break;
					}
				}
				_N[to].link = x;
				_N[to].sum = func(_N[to].sum,_N[now].sum);
				Q.push(to);
			}
		}
	}
	
	T get_value(string S){
		T ret = 0;
		int now = 0;
		for(int i=0;i<S.size();i++){
			int c = get(S[i]);
			if(_N[now].next[c]!=-1){
				now = _N[now].next[c];
				ret = func(ret,_N[now].v);
			}
			else{
				while(now!=0){
					now = _N[now].link;
					if(_N[now].next[c]!=-1){
						now = _N[now].next[c];
						ret = func(ret,_N[now].v);
						break;
					}
				}
			}
		}
		return ret;
	}
	
	void dfs(int now = 0){
		
		while(true){
			
			int cnt = 0;
			int ind = -1;
			for(int i=0;i<26;i++){
				if(_N[now].next[i]!=-1){
					cnt++;
					ind = i;
				}
			}
			if(cnt!=1)break;
			int t = _N[now].next[ind];
			if(_N[t].v!=-1)break;
			_N[now].next = _N[t].next;
		}			
		
		for(int i=0;i<26;i++){
			if(_N[now].next[i]!=-1)dfs(_N[now].next[i]);
		}
	}
	
	void dfs2(vector<string> &X,int now,string &S){
		if(_N[now].v!=-1){
			X[_N[now].v]=S;
		}
		for(int i=0;i<26;i++){
			if(_N[now].next[i]==-1)continue;
			S += 'a'+i;
			dfs2(X,_N[now].next[i],S);
			S.pop_back();
		}
	}
	
	void dfs3(int now = 0){
		if(_N[now].v==-1)_N[now].sum=0;
		else _N[now].sum=1;
		for(int i=0;i<26;i++){
			if(_N[now].next[i]==-1)continue;
			dfs3(_N[now].next[i]);
			_N[now].sum += _N[_N[now].next[i]].sum;
		}
	}
	
	int check(string &X,string &Y){
		int now = 0;
		int ans = 0;
		//cout<<X<<endl;
		for(int i=0;i<X.size();i++){
			for(int j=0;j<Y.size();j++){
				int t = Y[j]-'a';
				if(Y[j]==X[i]){
					now = _N[now].next[t];
					break;
				}
				if(_N[now].next[t]==-1)continue;
				ans += _N[_N[now].next[t]].sum;
			}
			if(_N[now].v!=-1)ans++;
		}
		return ans;
	}
	
	int get(char c){
		return c-'a';
	}
	
	T func(T a,T b){
		return a+b;
	}
	
};

int main(){
	
	int N;
	cin>>N;
	
	vector<string> S(N);
	trie<int> T(26,-1);
	for(int i=0;i<N;i++){
		cin>>S[i];
		T.add(S[i],i);
	}
	
	T.dfs();
	string s = "";
	T.dfs2(S,0,s);
	
	T.dfs3();
	int Q;
	cin>>Q;
	for(int i=0;i<Q;i++){
		int k;
		cin>>k;
		k--;
		string t;
		cin>>t;
		cout<<T.check(S[k],t)<<endl;
	}
	return 0;
}


Measured memory_bytes: 63788