Problem:
Score : 1100 points

Problem Statement

There are N strings of lowercase alphabet only. The i-th string is S_i. Every string is unique.

Provide answers for the Q queries below. The i-th query has the following format:

Query: An integer k_i and a string p_{i,1}p_{i,2}...p_{i,26} that results from permuting {a,b,...,z} are given. Output the sequence of the string S_{k_i} among the N strings in lexicographical order when the literal sequence is p_{i,1}<p_{i,2}<...<p_{i,26}.

Constraints

1 ≦ N,Q ≦ 100000

1 ≦ |S_i| (1 ≦ i ≦ N)

S_i (1 ≦ i ≦ N) is a string of lowercase alphabet.

The sum of |S_i| is no more than 400000.

Every S_i is unique.

1 ≦ k_i ≦ N (1 ≦ i ≦ Q)

For all 1 ≦ i ≦ Q, p_{i,1}p_{i,2}...p_{i,26} is a permutation of abcd...z.

Input

Inputs are provided from standard inputs in the following form.

N
S_1
:
S_N
Q
k_1 p_{1,1}p_{1,2}...p_{1,26}
:
k_Q p_{Q,1}p_{Q,2}...p_{Q,26}

Output

Output Q lines.

On line i, for the i-th query, output an integer indicating the sequence of the string S_{k_i} among the N strings in lexicographical order.

Sample Input 1

5
aa
abbaa
abbba
aaab
aaaaaba
5
1 abcdefghijklmnopqrstuvwxyz
2 bacdefghijklmnopqrstuvwxyz
3 abcdefghijklmnopqrstuvwxyz
4 bacdefghijklmnopqrstuvwxyz
5 abcdefghijklmnopqrstuvwxyz

Sample Output 1

1
2
5
4
2

When the literal sequence is a < b, sorting the input strings in lexicographical order yields aa, aaaaaba, aaab, abbaa, abbba. The answers to queries 1, 3, and 5 are thus 1, 5, and 2, respectively.

When the literal sequence is b < a, sorting the input strings in lexicographical order yields abbba, abbaa, aa, aaab, aaaaaba. The answers to queries 2 and 4 are thus 2 and 4, respectively.

Sample Input 2

8
abrakatabra
abadaba
abracadabra
atcoder
grand
contest
ababa
a
6
3 abcdefghijklmnopqrstuvwxyz
6 qwertyuiopasdfghjklzxcvbnm
8 poiuytrewqlkjhgfdsamnbvcxz
2 qazwsxedcrfvtgbyhnujmikolp
1 plokmijnuhbygvtfcrdxeszwaq
4 mnbvcxzasdfghjklpoiuytrewq

Sample Output 2

4
8
2
3
4
7

Solution in C++14 (GCC 5.4.1) (judge verdict: Time Limit Exceeded)

#include <bits/stdc++.h>
using namespace std;

#define dump(...) cout<<"# "<<#__VA_ARGS__<<'='<<(__VA_ARGS__)<<endl
#define repi(i,a,b) for(int i=int(a);i<int(b);i++)
#define peri(i,a,b) for(int i=int(b);i-->int(a);)
#define rep(i,n) repi(i,0,n)
#define per(i,n) peri(i,0,n)
#define all(c) begin(c),end(c)
#define mp make_pair
#define mt make_tuple

using uint=unsigned;
using ll=long long;
using ull=unsigned long long;
using vi=vector<int>;
using vvi=vector<vi>;
using vl=vector<ll>;
using vvl=vector<vl>;
using vd=vector<double>;
using vvd=vector<vd>;
using vs=vector<string>;

template<typename T1,typename T2>
ostream& operator<<(ostream& os,const pair<T1,T2>& p){
	return os<<'('<<p.first<<','<<p.second<<')';
}

template<typename Tuple>
void print_tuple(ostream&,const Tuple&){}
template<typename Car,typename... Cdr,typename Tuple>
void print_tuple(ostream& os,const Tuple& t){
	print_tuple<Cdr...>(os,t);
	os<<(sizeof...(Cdr)?",":"")<<get<sizeof...(Cdr)>(t);
}
template<typename... Args>
ostream& operator<<(ostream& os,const tuple<Args...>& t){
	print_tuple<Args...>(os<<'(',t);
	return os<<')';
}

template<typename Ch,typename Tr,typename C>
basic_ostream<Ch,Tr>& operator<<(basic_ostream<Ch,Tr>& os,const C& c){
	os<<'[';
	for(auto i=begin(c);i!=end(c);++i)
		os<<(i==begin(c)?"":" ")<<*i;
	return os<<']';
}

constexpr int INF=1e9;
constexpr int MOD=1e9+7;
constexpr double EPS=1e-9;

constexpr int ALPHABET=26;

int ToInt(char c)
{
	return c-'a';
}

char ToChar(int x)
{
	return x+'a';
}

struct Node{
	shared_ptr<Node> parent;
	array<shared_ptr<Node>,ALPHABET> children;
	bool last;
	int count;
	Node():last(false),count(0){}
};

struct Patricia{
	shared_ptr<Node> root;
	Patricia():root(make_shared<Node>()){}
	shared_ptr<Node> Add(const string& s){
		auto cur=root;
		for(char c:s){
			auto& child=cur->children[ToInt(c)];
			if(!child){
				child=make_shared<Node>();
				child->parent=cur;
			}
			cur=child;
			cur->count++;
		}
		cur->last=true;
		return cur;
	}
	void Dump(shared_ptr<Node> cur,int depth){
		int cnt=0;
		rep(i,ALPHABET) if(cur->children[i]){
			if(cnt++) cout<<endl<<string(depth*4,' ');
			cout<<ToChar(i)<<'('<<cur->children[i]->count<<')';
			Dump(cur->children[i],depth+1);
		}
	}
	void Dump(){
		Dump(root,0);
		cout<<endl;
	}
};

int main()
{
	for(int n;cin>>n && n;){
		vs ss(n);
		rep(i,n) cin>>ss[i];
		int q; cin>>q;
		vi ks(q);
		vs ps(q);
		rep(i,q){
			cin>>ks[i]>>ps[i];
			ks[i]--;
		}

		//dump(mt(n,q));
		//dump(ss); dump(ks); dump(ps);

		Patricia pt;
		vector<shared_ptr<Node>> lasts;
		for(auto s:ss) lasts.push_back(pt.Add(s));

		//pt.Dump();

		rep(_,q){
			string s=ss[ks[_]];
			string p=ps[_];

			shared_ptr<Node> cur=pt.root;
			int res=0;
			rep(i,s.size()){
				if(cur->last)
					res++;
				for(char c:p){
					if(s[i]==c) break;
					if(cur->children[ToInt(c)])
						res+=cur->children[ToInt(c)]->count;
				}
				cur=cur->children[ToInt(s[i])];
			}
			cout<<res+1<<endl;
		}
	}
}