#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define all(x) (x).begin(),(x).end()
const int mod=1000000007,MAX=200005,INF=1<<30;

template< int char_size >
struct TrieNode {
    int nxt[char_size];//nxt[c]==c番目の文字のnodeのindex
    int dis[char_size];
    
    int exist;//子の数？
    vector< int > accept;//そこで終わるののidリスト
    
    TrieNode() : exist(0) {
        memset(nxt, -1, sizeof(nxt));
        memset(dis, 0, sizeof(dis));
    }
};

template< int char_size, int margin >//文字の種類数(26など),開始文字('a'など)
struct Trie {
    using Node = TrieNode< char_size >;
    
    vector< Node > nodes;
    int root;
    
    Trie() : root(0) {
        nodes.push_back(Node());
    }
    
    void update_direct(int node, int id) {
        nodes[node].accept.push_back(id);//そこで終わるのがid
    }
    
    void update_child(int node, int child, int id) {
        ++nodes[node].exist;
    }
    
    void add(const string &str, int str_index, int node_index, int id) {
        if(str_index == str.size()) {
            update_direct(node_index, id);//探索終了
        } else {
            const int c = str[str_index] - margin;
            if(nodes[node_index].nxt[c] == -1) {
                nodes[node_index].nxt[c] = (int) nodes.size();//nodes.size()==行き先のnode_index
                nodes[node_index].dis[c]=1;
                nodes.push_back(Node());
            }//まだ行き先のnodeが追加されていない場合
            add(str, str_index + 1, nodes[node_index].nxt[c], id);
            update_child(node_index, nodes[node_index].nxt[c], id);
        }
    }
    
    void add(const string &str, int id) {
        add(str, 0, 0, id);//1文字目はnodeのindexが0なので
    }
    
    void add(const string &str) {
        add(str, nodes[0].exist);//nodes[0].exist==add回数
    }
    
    void query(const string &str, const function< void(int) > &f, int str_index, int node_index) {
        for(auto &idx : nodes[node_index].accept) f(idx);//そこで終わるやつが見つかったら(prefixのこと)fをやる
        if(str_index == str.size()) {
            return;//探索終了
        } else {
            const int c = str[str_index] - margin;
            if(nodes[node_index].nxt[c] == -1) return;//なかったら終わり
            query(str, f, str_index + 1, nodes[node_index].nxt[c]);
        }
    }
    
    void query(const string &str, const function< void(int) > &f) {
        query(str, f, 0, 0);
    }
    
    int DFS(const string &str,const string &ord,int str_index,int node_index){
        int ret=0;
        ret+=nodes[node_index].accept.size();
        
        if(str_index>=str.size()) return ret;
        
        for(int i=0;i<26;i++){
            int c=ord[i]-margin;
            
            if(ord[i]==str[str_index]){
                if(nodes[node_index].nxt[c]==-1) break;
                ret+=DFS(str,ord,str_index+nodes[node_index].dis[c],nodes[node_index].nxt[c]);
                break;
            }else{
                if(nodes[node_index].nxt[c]==-1) continue;
                ret+=nodes[nodes[node_index].nxt[c]].exist+nodes[nodes[node_index].nxt[c]].accept.size();
            }
        }
        
        return ret;
    }
    
    void shrink(int node_index){
        int cn=0;
        for(int i=0;i<26;i++){
            if(nodes[node_index].nxt[i]!=-1) cn++;
        }
        if(cn>=2){
            for(int i=0;i<26;i++){
                if(nodes[node_index].nxt[i]!=-1){
                    shrink(nodes[node_index].nxt[i]);
                }
            }
            return;
        }
        for(int i=0;i<26;i++){
            if(nodes[node_index].nxt[i]==-1) continue;
            int to=nodes[node_index].nxt[i];
            int a=1;
            while(1){
                int cnt=0,v=-1;
                for(int j=0;j<26;j++){
                    if(nodes[to].nxt[j]!=-1){
                        v=nodes[to].nxt[j];
                        cnt++;
                    }
                    if(cnt>=2) break;
                }
                if(nodes[to].accept.size()) cnt=2;
                
                if(cnt>=2){
                    nodes[node_index].nxt[i]=to;
                    nodes[node_index].dis[i]=a;
                    
                    //cout<<node_index<<" "<<i<<" "<<to<<endl;
                    shrink(to);
                    break;
                }
                if(cnt==0) break;
                to=v;
                a++;
            }
        }
    }
    
    int count() const {
        return (nodes[0].exist);
    }//idの個数
    
    int size() const {
        return ((int) nodes.size());
    }//node_indexの個数
};
//id==文字列の番号、str_index==文字列の何文字目か、node_index==nodeのindex
//Trie<26,'a'> trieのように初期化

int main(){
    
    std::ifstream in("text.txt");
    std::cin.rdbuf(in.rdbuf());
    cin.tie(0);
    ios::sync_with_stdio(false);
    
    int N;cin>>N;
    vector<string> S(N);
    Trie<26,'a'> trie;
    
    for(int i=0;i<N;i++){
        cin>>S[i];
        trie.add(S[i]);
    }
    
    trie.shrink(0);
    
    int Q;cin>>Q;
    
    while(Q--){
        int k;cin>>k;
        k--;
        string T;cin>>T;
        cout<<trie.DFS(S[k],T,0,0)<<endl;
    }
    
}





Measured memory_bytes: 140384