#include <fstream>
#include <string.h>
using namespace std;
ifstream in ("trie.in");
ofstream out ("trie.out");
struct Trie
{
int n,nsons;
Trie *son[26];
Trie()
{
n=nsons=0;
for(int i=0;i<26;i++)
{
son[i]=0;
}
}
};
Trie *T=new Trie;
char s[25];
void ADD (Trie *nod,char *sir)
{
int Letter=*sir-'a';
if(*sir==NULL)
{
nod->n++;
return;
}
if(nod->son[Letter]==0)
{
nod->son[Letter]=new Trie;
nod->nsons++;
}
ADD(nod->son[Letter],sir+1);
}
int DELETE (Trie *nod,char *sir)
{
int Letter=*sir-'a';
if (*sir==NULL)
{
nod->n--;
}
else
{
if (DELETE(nod->son[Letter],sir+1)==1)
{
nod->son[Letter]=0;
nod->nsons--;
}
}
if (nod->n==0&&nod->nsons==0&&nod!=T)
{
delete nod;
return 1;
}
return 0;
}
int NRAPP(Trie *nod,char *sir)
{
int Letter = *sir-'a';
if (*sir==NULL)
return nod->n;
if (nod->son[Letter]==0)
return 0;
return NRAPP(nod->son[Letter],sir+1);
}
int NRPREF(Trie *nod, char *sir, int cont)
{
int Letter=*sir-'a';
if(*sir ==NULL)
return cont;
if(nod->son[Letter]==0)
return cont;
return NRPREF(nod->son[Letter],sir+1,cont+1);
}
int main()
{
while(in.getline(s,25))
{
int opt=*s-'0';
switch(opt)
{
case 0: ADD(T,s+2);break;
case 1: DELETE(T,s+2);break;
case 2: out<<NRAPP(T,s+2)<<'\n';break;
case 3: out<<NRPREF(T,s+2,0)<<'\n';break;
}
}
}