#include <bits/stdc++.h>
#pragma GCC diagnostic ignored "-Wsign-compare"
#pragma GCC diagnostic ignored "-Wsign-conversion"

#define NDEBUG
using i32 = int32_t;
using i64 = int64_t;
using u32 = uint32_t;
using u64 = uint64_t;
using uint = unsigned int;
using usize = std::size_t;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
template<typename T> constexpr T popcount(const T u) { return u ? static_cast<T>(__builtin_popcountll(static_cast<u64>(u))) : static_cast<T>(0); }
template<typename T> constexpr T log2p1(const T u) { return u ? static_cast<T>(64 - __builtin_clzll(static_cast<u64>(u))) : static_cast<T>(0); }
template<typename T> constexpr T msbp1(const T u) { return log2p1(u); }
template<typename T> constexpr T lsbp1(const T u) { return __builtin_ffsll(u); }
template<typename T> constexpr T clog(const T u) { return u ? log2p1(u - 1) : static_cast<T>(u); }
template<typename T> constexpr bool ispow2(const T u) { return u and (static_cast<u64>(u) & static_cast<u64>(u - 1)) == 0; }
template<typename T> constexpr T ceil2(const T u) { return static_cast<T>(1) << clog(u); }
template<typename T> constexpr T floor2(const T u) { return u == 0 ? static_cast<T>(0) : static_cast<T>(1) << (log2p1(u) - 1); }
template<typename T> constexpr bool btest(const T mask, const usize ind) { return ((static_cast<u64>(mask) >> ind) & static_cast<u64>(1)); }
template<typename T> constexpr T bcut(const T mask, const usize ind) { return ind == 0 ? static_cast<T>(0) : static_cast<T>((static_cast<u64>(mask) << (64 - ind)) >> (64 - ind)); }
template<typename T> bool chmin(T& a, const T& b) { return (a > b ? a = b, true : false); }
template<typename T> bool chmax(T& a, const T& b) { return (a < b ? a = b, true : false); }
constexpr unsigned int mod                  = 1000000007;
template<typename T> constexpr T inf_v      = std::numeric_limits<T>::max() / 4;
template<typename Real> constexpr Real pi_v = Real{3.141592653589793238462643383279502884};


/**
 * http://xoshiro.di.unimi.it/xoshiro128starstar.c
 * http://xoshiro.di.unimi.it/xoshiro256starstar.c
 * http://xoshiro.di.unimi.it/splitmix64.c
 */
class xoshiro
{
public:
    using result_type = uint32_t;
    static constexpr result_type min() { return std::numeric_limits<result_type>::min(); }
    static constexpr result_type max() { return std::numeric_limits<result_type>::max(); }
    xoshiro() : xoshiro(std::random_device{}()) {}
    xoshiro(uint64_t seed)
    {
        uint64_t z = 0;
        for (int i = 0; i < 4; i++) { z = (seed += 0x9e3779b97f4a7c15), z = (z ^ (z >> 33)) * 0x62A9D9ED799705F5, z = (z ^ (z >> 28)) * 0xCB24D0A5C88C35B3, s[i] = static_cast<result_type>(z >> 32); }
    }
    result_type operator()()
    {
        const result_type result = rotl(s[1] * 5, 7) * 9, t = s[1] << 9;
        return s[2] ^= s[0], s[3] ^= s[1], s[1] ^= s[2], s[0] ^= s[3], s[2] ^= t, s[3] = rotl(s[3], 11), result;
    }
    void discard(const usize rep)
    {
        for (usize i = 0; i < rep; i++) { (*this)(); }
    }

private:
    result_type s[4];
    static result_type rotl(const result_type x, const int k) { return (x << k) | (x >> (32 - k)); }
};
class xoshiro_64
{
public:
    using result_type = uint64_t;
    static constexpr result_type min() { return std::numeric_limits<result_type>::min(); }
    static constexpr result_type max() { return std::numeric_limits<result_type>::max(); }
    xoshiro_64() : xoshiro_64(std::random_device{}()) {}
    xoshiro_64(uint64_t seed)
    {
        uint64_t z = 0;
        for (int i = 0; i < 4; i++) { z = (seed += 0x9e3779b97f4a7c15), z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9, z = (z ^ (z >> 27)) * 0x94d049bb133111eb, s[i] = static_cast<result_type>(z ^ (z >> 31)); }
    }
    result_type operator()()
    {
        const result_type result = rotl(s[1] * 5, 7) * 9, t = s[1] << 17;
        return s[2] ^= s[0], s[3] ^= s[1], s[1] ^= s[2], s[0] ^= s[3], s[2] ^= t, s[3] = rotl(s[3], 45), result;
    }
    void discard(const usize rep)
    {
        for (usize i = 0; i < rep; i++) { (*this)(); }
    }

private:
    result_type s[4];
    static result_type rotl(const result_type x, const int k) { return (x << k) | (x >> (64 - k)); }
};
template<typename Rng>
class rng_base
{
public:
    using rng_type    = Rng;
    using result_type = typename rng_type::result_type;
    static constexpr result_type min() { return rng_type::min(); }
    static constexpr result_type max() { return rng_type::max(); }
    rng_base() : rng_base(std::random_device{}()) {}
    rng_base(const u64 seed) : rng(seed) {}
    ~rng_base() = default;
    result_type operator()() { return rng(); }
    template<typename Int>
    Int uniform_int(const Int max)
    {
        static_assert(std::is_integral<Int>::value, "Integer type is needed.");
        if (ispow2(max + 1)) { return static_cast<Int>(rng() & max); }
        const result_type mask = static_cast<result_type>(ceil2(static_cast<u64>(max + 1))) - 1;
        while (true) {
            const Int ans = static_cast<Int>(rng() & mask);
            if (ans <= max) { return ans; }
        }
    }
    template<typename Int> Int uniform_int(const Int min, const Int max) { return min + uniform_int(static_cast<Int>(max - min)); }
    bool uniform_bool() { return uniform_int<bool>(0, 1); }
    template<typename Real>
    Real uniform_real()
    {
        static_assert(std::is_floating_point<Real>::value, "FloatingPoint type is needed.");
        return static_cast<Real>(uniformInt(~static_cast<result_type>(0)) / static_cast<Real>(~static_cast<result_type>(0)));
    }
    template<typename Real> Real uniform_real(const Real min, const Real max) { return assert(min <= max), uniform_real<Real>() * (max - min) + min; }
    template<typename Int> std::pair<Int, Int> uniform_int_pair(const Int min, const Int max) { return std::minmax(uniform_int(min, max), uniform_int(min, max)); }
    template<typename Int>
    std::vector<Int> uniform_int_vec(const std::size_t size, const Int min, const Int max)
    {
        std::vector<Int> v(size);
        for (std::size_t i = 0; i < size; i++) { v[i] = uniformInt(min, max); }
        return v;
    }
    template<typename Real>
    std::vector<Real> uniform_real_vec(const std::size_t size, const Real min, const Real max)
    {
        std::vector<Real> v(size);
        for (std::size_t i = 0; i < size; i++) { v[i] = uniformReal(min, max); }
        return v;
    }
    void discard(const usize rep) { rng.discard(rep); }

private:
    Rng rng;
};
using rng_mt        = rng_base<std::mt19937>;
using rng_mt64      = rng_base<std::mt19937_64>;
using rng_xoshiro   = rng_base<xoshiro>;
using rng_xoshiro64 = rng_base<xoshiro_64>;
rng_mt g_rng_mt;
rng_mt64 g_rng_mt64;
rng_xoshiro g_rng_xo;
rng_xoshiro64 g_rng_xo64;
template<typename T>
T read()
{
    T v;
    return std::cin >> v, v;
}
template<typename T>
std::vector<T> read_vec(const std::size_t size)
{
    std::vector<T> v(size);
    for (auto& e : v) { std::cin >> e; }
    return v;
}
#define SHOW(...) static_cast<void>(0)
template<typename T>
std::vector<T> make_v(const std::size_t size, T v) { return std::vector<T>(size, v); }
template<class... Args>
auto make_v(const std::size_t size, Args... args) { return std::vector<decltype(make_v(args...))>(size, make_v(args...)); }

class patricia
{
public:
    struct node_t;
    using ptr_t       = std::shared_ptr<node_t>;
    using const_ptr_t = std::shared_ptr<const node_t>;

private:
    using pair = std::pair<ptr_t, usize>;

public:
    struct node_t
    {
        node_t() = default;
        node_t(const std::string& prefix, const usize sub = 0, const usize count = 0) : prefix{prefix}, sub{sub}, count{count} {}
        std::string prefix{};
        usize sub = 0, count = 0;
        std::map<char, ptr_t> child{};
        friend std::ostream& operator<<(std::ostream& os, const node_t& node) { return os << "[" << node.prefix << "," << node.sub << "," << node.count << "]"; }
        static const pair next(const pair q, const std::string& s, const bool create = false)
        {
            const auto p     = q.first;
            const auto index = q.second;
            const auto c     = s[index];
            if (p->child.find(c) == p->child.end()) {
                if (not create) { return pair{p, index}; }
                return p->child[c] = std::make_shared<node_t>(s.substr(index)), pair{p->child[c], s.size()};
            }
            const auto prefix = p->child.at(c)->prefix;
            const usize n = s.size(), m = prefix.size();
            usize lcp = 0;
            for (; index + lcp < n and lcp < m and s[index + lcp] == prefix[lcp]; lcp++) {}
            if (lcp == m) { return pair{p->child.at(c), index + lcp}; }
            if (not create) { return pair{p, index}; }
            const ptr_t nxt = p->child.at(c), mid = std::make_shared<node_t>(s.substr(index, lcp), nxt->sub);
            return mid->child[nxt->prefix[lcp]] = nxt, nxt->prefix = nxt->prefix.substr(lcp), p->child.at(c) = mid, pair{mid, index + lcp};
        }
    };
    patricia() : root{std::make_shared<node_t>()} {}
    void add(const std::string& s)
    {
        const usize n = s.size();
        pair p{root, 0};
        for (; p.second < n;) { p.first->sub++, p = node_t::next(p, s, true); }
        p.first->sub++, p.first->count++;
    }
    usize count(const std::string& s) const
    {
        const auto p = tail(s);
        return p.second == s.size() ? p.first->count : 0UL;
    }
    usize sub(const std::string& s) const
    {
        const auto p = tail(s);
        if (p.second == s.size()) { return p.first->sub; }
        const char c = s[p.second];
        if (p.first->child.find(c) == p.first->child.end()) { return 0UL; }
        return p.first->child.at(c)->prefix.substr(0, s.size() - p.second) == s.substr(p.second) ? p.first->child.at(c)->sub : 0UL;
    }
    friend std::ostream& operator<<(std::ostream& os, const patricia& pat)
    {
        auto rec = [&](auto&& self, const auto p) {
            if (not p) { return; }
            os << "(" << *p;
            for (const auto& q : p->child) { self(self, q.second); }
            os << ")";
        };
        return rec(rec, pat.root), os;
    }
    const std::vector<const_ptr_t> path_to(const std::string& s) const
    {
        std::vector<const_ptr_t> ans;
        const usize n = s.size();
        const_ptr_t p = root;
        usize index   = 0;
        for (; index < n;) {
            ans.push_back(p);
            const auto c = s[index];
            p            = p->child.at(c);
            index += p->prefix.size();
        }
        return ans.push_back(p), ans;
    }

private:
    const pair tail(const std::string& s) const
    {
        const usize n = s.size();
        pair p{root, 0};
        for (; p.second < n;) {
            const auto prev = p.second;
            p               = node_t::next(p, s, false);
            if (p.second == prev) { break; }
        }
        return p;
    }
    ptr_t root;
};
int main()
{
    std::cin.tie(nullptr), std::ios::sync_with_stdio(false);
    patricia pat;
    const auto N = read<usize>();
    const auto S = read_vec<std::string>(N);
    for (usize i = 0; i < N; i++) { pat.add(S[i]); }
    const auto Q = read<usize>();
    std::vector<usize> o(256);
    for (usize i = 0; i < Q; i++) {
        const auto k = read<usize>() - 1;
        const auto p = read<std::string>();
        for (usize i = 0; i < 26; i++) { o[p[i]] = i; }
        const auto nodes = pat.path_to(S[k]);
        usize ans        = 0;
        for (usize i = 0; i + 1 < nodes.size(); i++) {
            ans += nodes[i]->count;
            const char c = nodes[i + 1]->prefix.front();
            for (const auto& p : nodes[i]->child) {
                if (o[p.first] < o[c]) { ans += p.second->sub; }
            }
        }
        std::cout << ans + 1 << "\n";
    }
    return 0;
}


Measured memory_bytes: 30336