#include<fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
int op;
char s[20];
struct nod{
int nr;
int nr_fii;
nod *f[26];
nod(){
nr=0;
nr_fii=0;
for(int i=0; i<26; i++)
f[i]=NULL;
}
} *point;
void inserare(nod *t,char *p){
if(*p==0){
t->nr++;
return;
}
if(t->f[*p-'a']==NULL){
t->f[*p-'a']=new nod;
t->nr_fii++;
}
inserare(t->f[*p-'a'],p+1);
}
int aparitii(nod *t,char *p){
if(*p==0){
return t->nr;
}
if(t->f[*p-'a']==NULL){
return 0;
}
return aparitii(t->f[*p-'a'],p+1);
}
int prefix(nod *t,char *p){
if(*p==0){
return 0;
}
if(t->f[*p-'a']==NULL){
return 0;
}
return prefix(t->f[*p-'a'],p+1)+1;
}
int stergere(nod *&t,char *p){
if(*p==0){
t->nr--;
if(t->nr==0 && t->nr_fii==0 && t!=point){
delete t;
t=0;
return 1;
}
return 0;
}
if(stergere(t->f[*p-'a'],p+1)){
t->nr_fii--;
if(t->nr==0 && t->nr_fii==0 && t!=point){
delete t;
t=0;
return 1;
}
}
return 0;
}
int main(){
point=new nod;
while(fin>>op){
fin>>s;
if(op==0){
inserare(point,s);
}
if(op==1){
stergere(point,s);
}
if(op==2){
fout<<aparitii(point,s)<<"\n";
}
if(op==3){
fout<<prefix(point,s)<<"\n";
}
}
return 0;
}