#include <bits/stdc++.h>
#include <string>
using namespace std;
#if 1
ifstream fin("trie.in");
ofstream fout("trie.out");
#define cin fin
#define cout fout
#endif // 0
struct Tre{
int ap = 0;
int nrfi=0;
Tre* fi[26]{};
void addSon(char* c){
if(!*c){
ap++;
return;
}
int let = *c-'a';
if(fi[let]==0){
nrfi++;
fi[let] = new Tre();
}
fi[let]->addSon(c+1);
}
void eraseSon(char * c){
if(!*c){
ap--;
return;
}
int let = *c - 'a';
fi[let]->eraseSon(c+1);
if(fi[let]->nrfi==0 && fi[let]->ap==0){
delete fi[let];
nrfi--;
fi[let] = 0;
}
}
int nrap(char* c){
if(*c==0)
return ap;
int let = *c - 'a';
if(fi[let]==0)
return 0;
return fi[let]->nrap(c+1);
}
int prefix(char* c){
if(*c==0)
return 0;
int let =*c-'a';
if(fi[let]==0)
return 0;
return fi[let]->prefix(c+1) + 1;
}
};
Tre rad;
int main(){
int op;
string str;
while(cin >> op >> str){
if(op==0){
rad.addSon(&str[0]);
}
else if(op == 1){
rad.eraseSon(&str[0]);
}
else if(op == 2){
cout << rad.nrap(&str[0]) << "\n";
}
else if(op == 3){
cout << rad.prefix(&str[0]) << "\n";
}
}
}