#include <iostream>
#include <cstring>
#include<fstream>
#include<cstdio>
#define l (*s - 'a')
using namespace std;
class nod{
int c,nrf;
nod *f[26];
public:
nod(){
c=nrf=0;
memset(f,0,sizeof(f));
}
friend class trie;
};
class trie{
nod *r;
void inserare(nod *x,char *s){
if(*s=='\0'){
x->c++;
return;
}
else{
if(x->f[l]==0){
x->nrf++;
x->f[l]=new nod;
}
}
inserare(x->f[l],(s+1));
}
int sterge(nod *x,char *s){
if(*s=='\0'){
x->c--;
}
else if(sterge(x->f[l],(s+1))){
x->nrf--;
x->f[l]=0;
}
if(x->c==0 && x->nrf==0 && x!=r){
delete x;
return 1;
}
return 0;
}
int aparitie(nod *x, char *s){
if(*s=='\0'){
return x->c;
}
if(x->f[l])return aparitie(x->f[l],(s+1));
return 0;
}
int prefix(nod *x, char *s, int k){
if(*s=='\0' || x->f[l]==0) return k;
return prefix(x->f[l], (s+1), k+1);
}
public:
trie(){
r=new nod;
}
void start_ins(char *sir){
inserare(r,sir);
}
int start_sterge(char *sir){
return sterge(r,sir);
}
int start_ap(char *sir){
return aparitie(r,sir);
}
int start_prefix(char *sir,int k){
return prefix(r,sir,k);
}
};
int main()
{
ifstream f("trie.in");
ofstream g("trie.out");
trie d;
char s[20];
int opt;
if(!f.eof()){
do{
f>>opt;
f>>s;
if(opt==0)d.start_ins(s);
else if(opt==1)d.start_sterge(s);
else if(opt==2)g<<d.start_ap(s)<<endl;
else g<<d.start_prefix(s,0)<<endl;
}while(!f.eof());
}
f.close();
g.close();
}