#include <cstdio>
#include<string.h>
using namespace std;
char s[30];
struct nod{
int ap, nrf;
nod *fii[26];
nod(){
ap=nrf=0;
memset(fii, 0, sizeof(fii));
}
};
nod *radacina;
void adauga(char sir[26], int n)
{
char c;
int i;
nod *aux1, *aux2;
aux1=radacina;
for(i=0;i<n;i++)
{
c=s[i];
if(aux1->fii[c-'a']==NULL)
{
aux1->nrf++;
aux2=new nod;
aux1->fii[c-'a']=aux2;
}
aux1=aux1->fii[c-'a'];
}
aux1->ap++;
}
int sterge(nod *aux, int n, int i, char sir[26])
{
int gasit=0;
if(i==n-1){
aux->ap--;
}
else{
if(sterge(aux->fii[sir[i+1]-'a'], n, i+1, sir))
{
aux->fii[sir[i+1]-'a']=0;
aux->nrf--;
}
}
if(aux->ap==0&&aux->nrf==0)
{
delete aux;
return 1;
}
return 0;
}
void parcurgere(nod *aux, int i, int n, char sir[26])
{
if(i==n-1)
printf("%d\n", aux->ap);
else{
if(aux->fii[sir[i+1]-'a']!=NULL)
parcurgere(aux->fii[sir[i+1]-'a'], i+1, n, sir);
else printf("0\n");
}
}
void prefix(char sir[26], int n, int i, int pr, nod *aux)
{
if(aux==NULL)
printf("%d\n", pr+1);
else{
if(aux->nrf!=0||aux->ap!=0)
prefix(sir, n, i+1, i, aux->fii[sir[i+1]-'a']);
else prefix(sir, n, i+1, pr, aux->fii[sir[i+1]-'a']);
}
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
int q, n;
gets(s);
radacina=new nod;
while(!feof(stdin))
{
q=s[0]-'0';
strcpy(s, s+2);
n=strlen(s);
if(q==0)
adauga(s, n);
if(q==1)
sterge(radacina->fii[s[0]-'a'], n, 0, s);
if(q==2)
{
if(radacina->fii[s[0]-'a']!=NULL)
parcurgere(radacina->fii[s[0]-'a'], 0, n, s);
else printf("0\n");
}
if(q==3)
{
if(radacina->fii[s[0]-'a']!=NULL)
prefix(s,n,0,0, radacina->fii[s[0]-'a']);
else printf("0\n");
}
gets(s);
}
return 0;
}