func_code_string: #include <bits/stdc++.h>   using namespace std;   const int inf = INT_MAX, df = 8e5 + 7;   int i, j, k = 1, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, le[df], rig[df],             c[df][26], ma[df << 1], head[df], pos[df << 1], tot, ans[df],             fail[df], cnt, yet[df][26];   struct node {     int sum, id;   };   vector<node> vec[df];   struct edge {     int to, nxt;   } e[df << 1];   void add(int u, int v) {     e[++o] = (edge){v, head[u]}, head[u] = o;     return;   }   char ch[df], st[df];   void upd(int x, int y) {     if (!x) return;     for (int i = x; i <= 800000; i += (i & -i)) ma[i] += y;     return;   }   int qry(int x) {     int as = 0;     for (int i = x; i; i -= (i & -i)) as += ma[i];     return as;   }   void insert1(int now, int v, int id) {     if (!c[now][v]) c[now][v] = ++tot;     pos[id] = c[now][v];     return;   }   void insert2(char *s, int id) {     int len = strlen(s), now = 0;     for (int i = (0); i <= (len - 1); ++i) {       int v = s[i] -  a ;       if (!c[now][v]) c[now][v] = ++tot;       now = c[now][v];     }     pos[id + n] = now;     return;   }   void init() {     scanf( %d , &n);     for (int i = (1); i <= (n); ++i) {       int op, x;       scanf( %d , &op);       if (op == 1) {         scanf( %s , ch), insert1(0, ch[0] -  a , i);       }       if (op == 2) {         scanf( %d , &x);         scanf( %s , ch);         insert1(pos[x], ch[0] -  a , i);       }     }     scanf( %d , &t);     for (int i = (1); i <= (t); ++i) {       int x;       scanf( %d , &x), scanf( %s , st);       insert2(st, i);       vec[pos[x]].push_back((node){pos[i + n], i});     }     return;   }   void build() {     queue<int> que;     for (int i = (0); i <= (25); ++i)       if (c[0][i]) fail[c[0][i]] = 0, que.push(c[0][i]), yet[0][i] = 1;     while (!que.empty()) {       int u = que.front();       que.pop();       for (int i = (0); i <= (25); ++i) {         if (c[u][i])           fail[c[u][i]] = c[fail[u]][i], yet[u][i] = 1, que.push(c[u][i]);         else           c[u][i] = c[fail[u]][i];       }     }     return;   }   void dfs1(int u) {     le[u] = ++cnt;     for (int i = head[u]; i; i = e[i].nxt) dfs1(e[i].to);     rig[u] = cnt;     return;   }   void dfs2(int u) {     upd(le[u], 1);     int siz = vec[u].size() - 1;     for (int i = (0); i <= (siz); ++i) {       int l = le[vec[u][i].sum], r = rig[vec[u][i].sum];       ans[vec[u][i].id] = qry(r) - qry(l - 1);     }     for (int i = (0); i <= (25); ++i)       if (yet[u][i]) dfs2(c[u][i]);     upd(le[u], -1);     return;   }   int main() {     init();     build();     for (int i = (1); i <= (tot); ++i) add(fail[i], i);     dfs1(0);     dfs2(0);     for (int i = (1); i <= (t); ++i) printf( %d n , ans[i]);     return 0;   }   