#include <bits/stdc++.h>
const int maxn = 1 << 19;
std::vector<int> g[maxn];
int op[maxn];
char c[maxn];
struct Trie {
  int ch[maxn][26], f[maxn];
  int sz, rt;
  int newnode() {
    memset(ch[sz], -1, sizeof(ch[sz]));
    return sz++;
  }
  void init() { sz = 0, rt = newnode(); }
  inline int idx(char c) { return c - 'a'; };
  int insert(const char* s) {
    int u = 0;
    for (int i = 0; s[i]; i++) {
      int c = idx(s[i]);
      if (ch[u][c] == -1) ch[u][c] = newnode();
      u = ch[u][c];
    }
    return u;
  }
  std::vector<int> g[maxn];
  int dfn;
  int in[maxn], out[maxn];
  void build() {
    std::queue<int> q;
    f[rt] = rt;
    for (int c = 0; c < 26; c++) {
      if (~ch[rt][c])
        f[ch[rt][c]] = rt, q.push(ch[rt][c]);
      else
        ch[rt][c] = rt;
    }
    while (!q.empty()) {
      int u = q.front();
      q.pop();
      for (int c = 0; c < 26; c++) {
        if (~ch[u][c])
          f[ch[u][c]] = ch[f[u]][c], q.push(ch[u][c]);
        else
          ch[u][c] = ch[f[u]][c];
      }
    }
    for (int i = 1; i < sz; i++) g[f[i]].push_back(i);
    dfn = 0;
    dfs(rt);
  }
  void dfs(int u) {
    in[u] = ++dfn;
    for (auto& v : g[u]) dfs(v);
    out[u] = dfn;
  }
} ac;
template <class T, int N>
class BIT {
 private:
  T data[N];

 public:
  BIT() {}
  void update(int x, T v) {
    for (int i = x; i < N; i += i & -i) data[i] += v;
  }
  T query(int l, int r) {
    T ret = 0;
    for (int i = r; i; i -= i & -i) ret += data[i];
    for (int i = l - 1; i; i -= i & -i) ret -= data[i];
    return ret;
  }
};
BIT<int, maxn> bit;
std::vector<std::pair<int, int>> query[maxn];
int ans[maxn];
void dfs(int i, int u) {
  int v = ac.ch[u][c[i] - 'a'];
  bit.update(ac.in[v], 1);
  for (auto& j : g[i]) dfs(j, v);
  for (auto& q : query[i])
    ans[q.second] = bit.query(ac.in[q.first], ac.out[q.first]);
  bit.update(ac.in[v], -1);
}
int main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  int n;
  std::cin >> n;
  for (int i = 1, x; i <= n; i++) {
    std::cin >> op[i];
    if (op[i] == 1)
      std::cin >> c[i];
    else {
      std::cin >> x >> c[i];
      g[x].push_back(i);
    }
  }
  ac.init();
  int q;
  std::cin >> q;
  std::string s;
  for (int i = 0, x; i < q; i++) {
    std::cin >> x >> s;
    query[x].emplace_back(ac.insert(s.c_str()), i);
  }
  ac.build();
  for (int i = 1; i <= n; i++)
    if (op[i] == 1) dfs(i, ac.rt);
  for (int i = 0; i < q; i++) std::cout << ans[i] << '\n';
}
