#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
int st[N], en[N];
vector<int> f[N];
struct Trie {
  int next[N][27], fail[N], end[N];
  int root;
  int tot;
  int newnode() {
    for (int i = 0; i < 27; i++) next[tot][i] = -1;
    end[tot++] = 0;
    return tot - 1;
  }
  void init() {
    tot = 0;
    root = newnode();
  }
  int insert(char buf[]) {
    int len = strlen(buf);
    int now = root;
    for (int i = 0; i < len; i++) {
      int k = buf[i] - 'a';
      if (next[now][k] == -1) next[now][k] = newnode();
      now = next[now][k];
    }
    end[now]++;
    return now;
  }
  void build() {
    queue<int> que;
    fail[root] = root;
    for (int i = 0; i < 27; i++)
      if (next[root][i] == -1)
        next[root][i] = root;
      else {
        fail[next[root][i]] = root;
        que.push(next[root][i]);
      }
    while (!que.empty()) {
      int now = que.front();
      que.pop();
      for (int i = 0; i < 27; i++)
        if (next[now][i] == -1)
          next[now][i] = next[fail[now]][i];
        else {
          fail[next[now][i]] = next[fail[now]][i];
          que.push(next[now][i]);
        }
    }
  }
  void ac_build() {
    for (int i = 1; i <= tot; i++) f[fail[i]].push_back(i);
  }
};
Trie ac;
vector<int> q[N];
vector<pair<int, int> > p[N];
char buf[N], s[N];
struct Bit {
  int b[N], n;
  void init(int nn) {
    n = nn + 10;
    memset(b, 0, sizeof(b));
  }
  int lowbits(int x) { return x & -x; }
  void add(int i, int v) {
    if (i <= 0) return;
    for (; i <= n; i += lowbits(i)) b[i] += v;
  }
  int sum(int i) {
    int ans = 0;
    for (; i > 0; i -= lowbits(i)) ans += b[i];
    return ans;
  }
} B;
int cnt;
void ac_dfs(int u) {
  st[u] = ++cnt;
  for (auto& v : f[u]) ac_dfs(v);
  en[u] = cnt;
}
bool ok[N];
void add(int u, int v) {
  B.add(st[u], v);
  B.add(en[u] + 1, -v);
}
int sum(int u) { return B.sum(en[u]) - B.sum(st[u] - 1); }
int ans[N];
void dfs(int u, int now) {
  now = ac.next[now][s[u] - 'a'];
  B.add(st[now], 1);
  for (auto& v : q[u]) dfs(v, now);
  for (auto& te : p[u]) ans[te.first] = sum(te.second);
  B.add(st[now], -1);
}
int main() {
  int n, m, op, id, v;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &op);
    if (op == 2)
      scanf("%d", &v), q[v].push_back(i);
    else
      ok[i] = true;
    scanf(" %c", &s[i]);
  }
  scanf("%d", &m);
  ac.init();
  for (int i = 1; i <= m; i++) {
    scanf("%d %s", &id, buf);
    p[id].push_back({i, ac.insert(buf)});
  }
  ac.build();
  ac.ac_build();
  ac_dfs(0);
  B.init(cnt + 2);
  for (int i = 1; i <= n; i++)
    if (ok[i]) dfs(i, ac.root);
  for (int i = 1; i <= m; i++) printf("%d\n", ans[i]);
  return 0;
}
