#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie
{
int fin,nr;
Trie *fiu[26];
Trie()
{
fin = nr = 0;
memset(fiu,0,sizeof(fiu));
}
};
Trie *T = new Trie;
void ins(Trie *node, char s[25], int k)
{
if(k==strlen(s))
{
node->fin++;
return;
}
if(!node->fiu[s[k]-'a'])
node->fiu[s[k]-'a']=new Trie,
node->nr++;
ins(node->fiu[s[k]-'a'], s, k+1);
}
int del(Trie *node, char s[25], int k)
{
if(k==strlen(s))
node->fin--;
else if(del(node->fiu[s[k]-'a'],s,k+1))
{
node->fiu[s[k]-'a']=0;
node->nr--;
}
if(!node->fin and !node->nr and node!=T)
{
delete node;
return 1;
}
return 0;
}
int findt(Trie *node, char s[25], int k)
{
if(k==strlen(s))
return node->fin;
if(node->fiu[s[k]-'a'])
return findt(node->fiu[s[k]-'a'],s,k+1);
return 0;
}
int pref(Trie *node, char s[25], int k)
{
if(k==strlen(s) or !node->fiu[s[k]-'a'])
return k;
return pref(node->fiu[s[k]-'a'],s,k+1);
}
int main()
{
int t;
char w[25];
while(fin >> t >> w)
{
if(t==0) ins(T, w, 0);
else if(t==1) del(T, w, 0);
else if(t==2) fout << findt(T, w, 0) << "\n";
else if(t==3) fout << pref(T, w, 0) << "\n";
}
return 0;
}