#include <cstdio>
#include <iostream>
using namespace std;
struct nod
{
int prefix,aparitii;
nod *nxt[26];
nod()
{
prefix=0;
aparitii=0;
for(int i=0; i<26; i++)
nxt[i]=NULL;
}
} *rad;
char cuv[30];
nod *insert(nod *act, char v[])
{
if(act==NULL) act=new nod;
act->prefix++;
if(v[0]==0)
{
act->aparitii++;
return act;
}
act->nxt[ v[0]-'a' ] = insert(act->nxt[ v[0]-'a' ],v+1);
return act;
}
nod *erase(nod *act, char v[])
{
act->prefix--;
if(v[0]==0)
{
act->aparitii--;
if(act->aparitii==0 && act->prefix==0)
{
delete act;
act=NULL;
}
return act;
}
act->nxt[v[0]-'a'] = erase(act->nxt[v[0]-'a'], v+1);
if(act->prefix==0)
{
delete act;
act=NULL;
}
return act;
}
int search(nod *act, char v[])
{
if(act==NULL) return 0;
if(v[0]==0) return act->aparitii;
return search(act->nxt[v[0]-'a'], v+1);
}
int pref( nod * act, char v[]){
if(act==NULL) return -1;
if(v[0]==0) return 0;
int val=pref(act->nxt[v[0]-'a'], v+1);
return 1+val;
}
int main()
{
ios_base::sync_with_stdio(false);
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
int t;
while(scanf("%d ",&t)==1)
{
gets(cuv);
if(t==0) rad=insert(rad,cuv);
if(t==1) rad=erase(rad,cuv);
if(t==2) printf("%d\n",search(rad,cuv));
if(t==3) printf("%d\n",pref(rad,cuv));
}
}