#include<fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie
{
int nr,fii;
trie *f[26];
trie()
{
nr=fii=0;
for (int i=0;i<26;++i)
f[i]=0;
}
} *root;
int a;
char s[26];
void adauga(trie *rad, char *s)
{
if (*s==0)
{
rad->nr++;
return ;
}
if (rad->f[*s-'a']==NULL)
{
rad->f[*s-'a'] = new trie;
rad->fii++;
}
adauga(rad->f[*s-'a'],s+1);
}
int sterge(trie *&rad, char *s)
{
if (*s==0)
{
rad->nr--;
if (rad->fii==0 && rad->nr==0 && rad!=root)
{
delete rad;
rad = NULL;
return 1;
}
return 0;
}
if (sterge(rad->f[*s-'a'],s+1))
{
rad->fii--;
if (rad->fii==0 && rad->nr==0 && rad!=root)
{
delete rad;
rad = NULL;
return 1;
}
}
return 0;
}
int aparitii(trie *rad, char *s)
{
if (*s==0)
return rad->nr;
if (rad->f[*s-'a']==NULL)
return 0;
return aparitii(rad->f[*s-'a'],s+1);
}
int prefix(trie *rad, char *s)
{
if (*s==0)
return 0;
if (rad->f[*s-'a']==NULL)
return 0;
return 1+prefix(rad->f[*s-'a'],s+1);
}
int main()
{
root = new trie;
while (fin>>a>>s)
{
switch (a)
{
case 0:
adauga(root,s);
break;
case 1:
sterge(root,s);
break;
case 2:
fout<<aparitii(root,s)<<"\n";
break;
case 3:
fout<<prefix(root,s)<<"\n";
break;
}
}
return 0;
}