//Roberto Deresu - FMI
//Re :)
#include<cstdio>
#include<cstring>
using namespace std;
int n,i,tip;
char s[27];
struct nod
{
int nr;
int nr_fii;
nod *fii[26];
nod *tata;
nod()
{
nr = 0;
nr_fii = 0;
tata = 0;
memset(fii,0,sizeof(fii));
}
};
nod *rad = new nod;
void Adauga(nod *nod_curent, char *s)
{
if(*s == 0)
{
nod_curent -> nr++;
return;
}
if(!nod_curent -> fii[*s-'a'])
{
nod_curent -> fii[*s-'a'] = new nod;
nod_curent -> fii[*s-'a'] -> tata = nod_curent;
nod_curent -> nr_fii++;
}
Adauga(nod_curent -> fii[*s-'a'], s+1);
}
void Sterge(nod *nod_curent, char *s)
{
if(*s == 0) nod_curent -> nr--;
else Sterge(nod_curent -> fii[*s-'a'], s+1);
if(nod_curent != rad && nod_curent -> nr_fii == 0 && nod_curent -> nr == 0)
{
nod_curent -> tata -> nr_fii--;
nod_curent -> tata -> fii[*(s-1)-'a'] = 0;
delete nod_curent;
}
}
int Numar_aparitii(nod *nod_curent,char *s)
{
if(*s == 0) return nod_curent -> nr;
if(!nod_curent -> fii[*s-'a']) return 0;
return Numar_aparitii(nod_curent -> fii[*s-'a'], s+1);
}
int Lungime_prefix(nod *nod_curent, char *s, int pas)
{
if(*s == 0 || !nod_curent -> fii[*s-'a']) return pas;
return Lungime_prefix(nod_curent -> fii[*s-'a'], s+1, pas+1);
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
while(scanf("%d %s",&tip,s) != EOF)
{
if(tip == 0) Adauga(rad, s);
else
if(tip == 1) Sterge(rad, s);
else
if(tip == 2) printf("%d\n", Numar_aparitii(rad, s));
else
if(tip == 3) printf("%d\n", Lungime_prefix(rad, s, 0));
}
return 0;
}