#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
char p[50];
struct Trie
{
int nrfii, cnt;
Trie *fiu[26];
Trie (){
nrfii = cnt = 0;
for (int i = 0; i < 26; ++i) fiu[i] = nullptr;
}
};
Trie *T = new Trie;
void ins(Trie *nod, char *s)
{
if (*s == '\0')
{
nod->cnt++;
return;
}
if (nod->fiu[*s - 'a'] == nullptr)
{
nod->nrfii++;
nod->fiu[*s - 'a'] = new Trie;
}
ins(nod->fiu[*s - 'a'], s + 1);
}
bool del(Trie *nod, char *s)
{
if( *s == '\0' )
nod->cnt --;
else if( del( nod->fiu[ *s - 'a' ], s+1 ) ) {
nod->fiu[ *s - 'a' ] = 0;
nod->nrfii --;
}
if( nod->cnt == 0 && nod->nrfii == 0 && nod != T ) {
delete nod; return 1;
}
return 0;
}
int numara(Trie *nod, char *s)
{
if (*s == '\0')
{
return nod->cnt;
}
if (nod->fiu[*s - 'a'] == nullptr) return 0;
return numara(nod->fiu[*s - 'a'], s + 1);
}
int numara2(Trie *nod, char *s, int k)
{
if (*s == '\0')
{
return k;
}
if (nod->fiu[*s - 'a'] == nullptr)
{
return k;
}
return numara2(nod->fiu[*s - 'a'], s + 1, k + 1);
}
int main()
{
while (fin.getline(p, 40))
{
if (p[0] == '0')
{
ins(T, p + 2);
}
else if (p[0] == '1')
{
del(T, p + 2);
}
else if (p[0] == '2')
{
fout << numara(T, p + 2) << "\n";
}
else
{
fout << numara2(T, p + 2, 0) << "\n";
}
}
fin.close();
fout.close();
return 0;
}