
#include<bits/stdc++.h>
#define int long long
using namespace std;
int tot=0,n,q,op[100005],cd1[100005],cd2[100005],cd3[100005];
int trie[200005][26],st[200005][18];
int v[200005],len[200005],dfn[200005],siz[200005],cnt;
string s[200005],T;
namespace seg{
#define ls p*2
#define rs p*2+1
struct node{
int l,r,sum,tag;
}t[800025];
inline void pushup(int p){t[p].sum=t[ls].sum+t[rs].sum;}
inline void pushdown(int p){
if(!t[p].tag) return;
t[ls].tag+=t[p].tag;
t[rs].tag+=t[p].tag;
t[ls].sum+=(t[ls].r-t[ls].l+1)*t[p].tag;
t[rs].sum+=(t[rs].r-t[rs].l+1)*t[p].tag;
t[p].tag=0;
}
void build(int p,int l,int r){
t[p].l=l,t[p].r=r,t[p].sum=t[p].tag=0;
if(l==r) return;
int mid=(l+r)/2;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(p);
}
void modify(int p,int l,int r,int val){
if(l<=t[p].l&&t[p].r<=r){
t[p].tag+=val;
t[p].sum+=val*(t[p].r-t[p].l+1);
return;
}
pushdown(p);
int mid=(t[p].l+t[p].r)/2;
if(l<=mid) modify(ls,l,r,val);
if(r>mid) modify(rs,l,r,val);
pushup(p);
}
void delet(int p,int x){
if(t[p].l==t[p].r){
t[p].tag=t[p].sum=0;
return;
}
pushdown(p);
int mid=(t[p].l+t[p].r)/2;
if(x<=mid) delet(ls,x);
else delet(rs,x);
pushup(p);
}
int query(int p,int x){
if(t[p].l==t[p].r) return t[p].sum;
pushdown(p);
int mid=(t[p].l+t[p].r)/2;
if(x<=mid) return query(ls,x);
return query(rs,x);
}
}
namespace Trie{
inline void insert(int p){
int u=0;
for(int i=0;i<s[p].length();i++){
int id=s[p][i]-'a';
if(!trie[u][id]){
trie[u][id]=++tot;
st[trie[u][id]][0]=u;
u=tot;
for(int j=1;j<=17;j++)
st[u][j]=st[st[u][j-1]][j-1];
}
else u=trie[u][id];
}
v[p]=u;
}
inline void rins(int p){
int u=p;
for(int i=0;i<T.length();i++){
int id=T[i]-'a';
if(!trie[u][id]){
trie[u][id]=++tot;
st[trie[u][id]][0]=u;
u=tot;
for(int j=1;j<=17;j++)
st[u][j]=st[st[u][j-1]][j-1];
}
else u=trie[u][id];
}
v[n]=u;
}
void dfs(int u){
dfn[u]=++cnt,siz[u]=1;
for(int i=0;i<26;i++)
if(trie[u][i]){
dfs(trie[u][i]);
siz[u]+=siz[trie[u][i]];
}
}
}
inline int calc(int x,int k){
int dis=len[x]-k;
int u=v[x];
for(int i=17;i>=0;i--)
if(dis>=(1<<i)){
dis-=1<<i;
u=st[u][i];
}
return u;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++) cin>>s[i];
for(int i=1;i<=n;i++) Trie::insert(i);
for(int i=1;i<=n;i++) len[i]=s[i].length();
cin>>q;
for(int i=1;i<=q;i++){
cin>>op[i]>>cd1[i];
if(op[i]==1) cin>>cd2[i]>>cd3[i];
else if(op[i]==2){
cin>>cd2[i]>>T;
n++;cd3[i]=n;
len[n]=cd2[i]+T.length();
Trie::rins(calc(cd1[i],cd2[i]));
}
}
Trie::dfs(0);
seg::build(1,1,tot+1);
for(int i=1;i<=q;i++){
if(op[i]==1){
int to=calc(cd1[i],cd2[i]);
seg::modify(1,dfn[to],dfn[to]+siz[to]-1,cd3[i]);
}
else if(op[i]==2) seg::delet(1,dfn[v[cd3[i]]]);
else cout<<seg::query(1,dfn[v[cd1[i]]])<<'\n';
}
return 0;
}