#include <bits/stdc++.h>
using namespace std;
const int N = 8e5 + 100;
struct Bit {
  int bit[N], n;
  int sum(int i) {
    int s = 0;
    while (i > 0) {
      s += bit[i];
      i -= i & -i;
    }
    return s;
  }
  void add(int i, int x) {
    while (i <= n) {
      bit[i] += x;
      i += i & -i;
    }
  }
} bit;
vector<int> que[N];
int t[N], ans[N];
struct AcTrie {
  int next[N][26], go[N][26], fail[N], pos[N >> 1];
  int root, tot;
  vector<int> end[N];
  int newnode() {
    for (int i = 0; i < 26; ++i) next[tot][i] = -1;
    end[tot++].clear();
    return tot - 1;
  }
  void init() {
    tot = 0;
    pos[0] = root = newnode();
  }
  int flx(char c) { return c - 'a'; }
  void add(int i, int now, char c) {
    if (next[now][flx(c)] == -1) next[now][flx(c)] = newnode();
    now = next[now][flx(c)];
    pos[i] = now;
  }
  int insert(char *buf) {
    int len = strlen(buf), now = root;
    for (int i = 0; i < len; ++i) {
      if (next[now][flx(buf[i])] == -1) next[now][flx(buf[i])] = newnode();
      now = next[now][flx(buf[i])];
    }
    return now;
  }
  void copy() {
    for (int i = 0; i < tot; ++i) memcpy(go[i], next[i], sizeof(next[i]));
  }
  int head[N], nex[N], to[N], tol;
  int l[N], r[N], dfs_clock;
  void build() {
    queue<int> Q;
    fail[root] = root;
    for (int i = 0; i < 26; ++i) {
      if (next[root][i] == -1)
        next[root][i] = root;
      else {
        fail[next[root][i]] = root;
        Q.push(next[root][i]);
      }
    }
    while (!Q.empty()) {
      int now = Q.front();
      Q.pop();
      for (int i = 0; i < 26; ++i) {
        if (next[now][i] == -1)
          next[now][i] = next[fail[now]][i];
        else {
          fail[next[now][i]] = next[fail[now]][i];
          Q.push(next[now][i]);
        }
      }
    }
    for (int i = 0; i < tot; ++i) head[i] = -1;
    dfs_clock = tol = 0;
    bit.n = tot;
    for (int i = 1; i < tot; ++i) {
      to[tol] = i;
      nex[tol] = head[fail[i]];
      head[fail[i]] = tol++;
    }
  }
  void dfs1(int u) {
    l[u] = ++dfs_clock;
    for (int i = head[u]; ~i; i = nex[i]) dfs1(to[i]);
    r[u] = dfs_clock;
  }
  void dfs2(int u) {
    bit.add(l[u], 1);
    for (int i = 0, j; i < que[u].size(); ++i) {
      j = que[u][i];
      ans[j] = bit.sum(r[t[j]]) - bit.sum(l[t[j]] - 1);
    }
    for (int i = 0; i < 26; ++i)
      if (~go[u][i]) dfs2(go[u][i]);
    bit.add(l[u], -1);
  }
} ac;
char read_char() {
  char ch = getchar();
  while (ch > 'z' || ch < 'a') ch = getchar();
  return ch;
}
int n, m, op, x;
char s[N], c;
int main() {
  scanf("%d", &n);
  ac.init();
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &op);
    op == 2 ? scanf("%d", &x) : x = 0;
    x = ac.pos[x];
    c = read_char();
    ac.add(i, x, c);
  }
  scanf("%d", &m);
  for (int i = 0; i < m; ++i) {
    scanf("%d %s", &x, s);
    x = ac.pos[x];
    t[i] = ac.insert(s);
    que[x].push_back(i);
  }
  ac.copy();
  ac.build();
  ac.dfs1(ac.root);
  ac.dfs2(ac.root);
  for (int i = 0; i < m; ++i) printf("%d\n", ans[i]);
}
