#include<bits/stdc++.h>
#define pt putchar(' ')
#define nl puts("")
#define pi pair<int,int>
#define pb push_back
#define go(it) for(auto &it:as[x])
using namespace std;
const int N=4e6+10;
int n,m,op,idx,stm;
char s[N];
int fa[N],dep[N],son[N],sz[N],top[N],dfn[N],dot[N];
vector<int> as[N];
int fr(){
int x=0,flag=1;
char ch=getchar();
while(ch<'0' || ch>'9'){
if(ch=='-') flag=-1;
ch=getchar();
}
while(ch>='0' && ch<='9'){
x=x*10+(ch-'0');
ch=getchar();
}
return x*flag;
}
void fw(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) fw(x/10);
putchar(x%10+'0');
}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
bool cop(int x,int y){return dfn[x]<dfn[y];}
struct Bit{
int s[N];
void add(int i,int x){for(;i<=idx;i+=i&(-i)) s[i]+=x;}
int query(int i)
{
int res=0;
for(;i;i-=i&(-i)) res+=s[i];
return res;
}
}bit;
struct Tree_Sub{
void init(int x,int rt)
{
dep[x]=dep[rt]+1;
fa[x]=rt,sz[x]=1;
go(v)
{
init(v,x);
sz[x]+=sz[v];
if(!son[x] || sz[son[x]]<sz[v]) son[x]=v;
}
}
void dfs(int x,int Top)
{
dfn[x]=++stm;
top[x]=Top;
if(!son[x]) return;
dfs(son[x],Top);
go(v) {if(!dfn[v]) dfs(v,v);}
}
int lca(int x,int y)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
return x;
}
}Tr;
struct ACAuto{
int tr[N][26],ed[N],fail[N];
void ins(int x)
{
int now=0;
for(int i=0;s[i];i++)
{
int word=s[i]-'a';
if(!tr[now][word]) tr[now][word]=++idx;
now=tr[now][word];
}
ed[x]=now;
}
void getfail()
{
queue<int> q;
for(int i=0;i<26;i++)
if(tr[0][i]) q.push(tr[0][i]);
while(q.size())
{
int t=q.front();
q.pop();
for(int i=0;i<26;i++)
{
int &now=tr[t][i];
if(!now) now=tr[fail[t]][i];
else
{
fail[now]=tr[fail[t]][i];
q.push(now);
}
}
}
}
void solve()
{
scanf("%s",s);
int now=0,len=0;
for(int i=0;s[i];i++)
{
int word=s[i]-'a';
now=tr[now][word],dot[++len]=now;
}
sort(dot+1,dot+1+len,cop);
len=unique(dot+1,dot+1+len)-dot-1;
for(int i=1;i<=len;i++) bit.add(dfn[dot[i]],1);
for(int i=2;i<=len;i++) bit.add(dfn[Tr.lca(dot[i],dot[i-1])],-1);
}
}AC;
int main()
{
n=fr();
for(int i=1;i<=n;i++) scanf("%s",s),AC.ins(i);
AC.getfail();
for(int i=1;i<=idx;i++) as[AC.fail[i]].pb(i);
Tr.init(0,idx+1),Tr.dfs(0,0);
m=fr();
for(int i=1;i<=m;i++)
{
op=fr();
if(op&1) AC.solve();
else
{
int x=AC.ed[fr()];
fw(bit.query(dfn[x]+sz[x]-1)-bit.query(dfn[x]-1)),nl;
}
}
return 0;
}