#include <fstream>
using namespace std;
ifstream cin ("trie.in");
ofstream cout ("trie.out");
const int lit = 26;
struct node{
node(){
ap = 0;
pref = 0;
for (int i=0; i<lit; i++){
next[i] = NULL;
}
}
int ap;
int pref;
node *next [lit];
};
void add_word (node *prev , string word , int pos , int size){
if (pos == size){
prev -> ap ++;
return;
}
if (prev -> next[word[pos] - 'a'] == NULL){
prev -> next[word[pos] - 'a'] = new node();
}
prev = prev -> next[word[pos] - 'a'];
prev -> pref ++;
add_word (prev , word , pos + 1 , size);
}
void delete_word (node *prev , string word , int pos , int size){
if (pos == size){
prev -> ap --;
return;
}
prev = prev -> next[word[pos] - 'a'];
prev -> pref --;
delete_word (prev , word , pos + 1 , size);
}
int ap_word (node *prev , string word , int pos , int size){
if (prev == NULL){
return 0;
}
if (pos == size){
return (prev -> ap);
}
return ap_word (prev -> next[word[pos] - 'a'] , word , pos + 1 , size);
}
int pref_word (node *prev , string word , int pos , int lung , int size){
prev = prev -> next[word[pos] - 'a'];
if (pos == size - 1){
return lung;
}
if (prev == NULL || prev -> pref == 0){
return lung;
}
return pref_word (prev , word , pos + 1, lung + 1 , size);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int test;
string word;
node *root = new node();
while(cin>>test){
cin>>word;
if (test == 0){
add_word(root , word , 0 , word.size());
}
if (test == 1){
delete_word(root , word , 0 , word.size());
}
if (test == 2){
int ans = ap_word(root , word , 0 , word.size());
cout<<ans<<'\n';
}
if (test == 3){
int ans = pref_word(root , word , 0 , 0 , word.size());
cout<<ans<<'\n';
}
}
return 0;
}