#20 MLE
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
using namespace std;
const int N=4e5+10,M=8e5+10;
int tot,cnt=1,stp;
vector<char>s[N],tmp;
vector< pair<int,int> >ask[M];
int ed[M],que[M],fir[M],dfn[M][2],rt[M],ans[N];
struct edge
{
int to;
int nxt;
}e[M];
inline void add(int x,int y)
{
e[++tot].to=y; e[tot].nxt=fir[x]; fir[x]=tot;
}
struct ACauto
{
int son1[27];
int son2[27];
int fail;
}t[M];
inline void insert(vector<char>S,int id)
{
int p=1,len=S.size();
for(int i=0;i<len;i++)
{
int ch=S[i]-'a';
if(!t[p].son1[ch]) t[p].son1[ch]=++cnt;
p=t[p].son1[ch];
}
ed[id]=p;
}
inline void getfail()
{
for(int i=0;i<26;i++)
t[0].son2[i]=1;
que[1]=1,t[1].fail=0;
int head=1,tail=1;
while(head<=tail)
{
int p=que[head++];
for(int i=0;i<26;i++)
{
int q=t[p].son2[i],nxt=t[p].fail;
if(!q){ t[p].son2[i]=t[nxt].son2[i]; continue; }
t[q].fail=t[nxt].son2[i];
que[++tail]=q;
}
}
}
inline int lowbit(int x)
{
return x&(-x);
}
inline void change(int x,int c)
{
for(int i=x;i<=cnt+1;i+=lowbit(i))
rt[i]+=c;
}
inline int query(int x)
{
int res=0;
for(int i=x;i>=1;i-=lowbit(i))
res+=rt[i];
return res;
}
inline void dfs1(int p)
{
dfn[p][0]=++stp;
for(int i=fir[p];i;i=e[i].nxt)
dfs1(e[i].to);
dfn[p][1]=stp;
}
inline void dfs2(int p)
{
change(dfn[p][0],1);
for(int i=0;i<ask[p].size();i++)
{
int x=ask[p][i].first;
ans[ask[p][i].second]=query(dfn[x][1])-query(dfn[x][0]-1);
}
for(int i=0;i<26;i++)
if(t[p].son1[i]) dfs2(t[p].son1[i]);
change(dfn[p][0],-1);
}
int main()
{
int T,n=0,m,opt,pos; char ch[N];
scanf("%d",&T);
for(int i=1;i<=T;i++)
{
scanf("%d",&opt);
if(opt==1) n++;
else
{
scanf("%d",&pos);
s[++n]=s[pos];
}
scanf("%s",ch);
s[n].push_back(ch[0]);
}
for(int i=1;i<=n;i++)
insert(s[i],i);
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d%s",&pos,ch);
tmp.clear();
for(int j=0;j<strlen(ch);j++)
tmp.push_back(ch[j]);
insert(tmp,n+i);
ask[ed[pos]].push_back(make_pair(ed[n+i],i));
}
for(int i=1;i<=cnt;i++)
for(int j=0;j<26;j++)
t[i].son2[j]=t[i].son1[j];
getfail();
for(int i=1;i<=cnt;i++)
add(t[i].fail,i);
dfs1(0),dfs2(1);
for(int i=1;i<=m;i++)
printf("%d\n",ans[i]);
return 0;
}