#include<cstdio>
#include<cstring>
#define N 1<<20
#define X 21
#define in freopen("trie.in","r",stdin)
#define out freopen("trie.out","w",stdout)
int n,nrn,ap[N],val[N],tata[N],nrf[N],nr[N][30];
char s[X];
//adauga adf(1,0,strlen(s)-1);
void adf(int nod,int poz,int lung)
{
if(poz==lung+1)
{
ap[nod]++;
return;
}
if(nr[nod][s[poz]-'a'])
adf(nr[nod][s[poz]-'a'],poz+1,lung);
else
{
nrf[nod]++;
nr[nod][s[poz]-'a']=++nrn;
tata[nrn]=nod;
val[nrn]=s[poz]-'a';
adf(nr[nod][s[poz]-'a'],poz+1,lung);
}
}
//sterge sdf(1,0,strlen(s)-1);
void sdf(int nod,int poz,int lung)
{
if(poz==lung+1)
{
ap[nod]--;
if(nrf[nod]==0 && ap[nod]==0)
{
nr[tata[nod]][val[nod]]=0;
nrf[tata[nod]]--;
tata[nod]=0;
val[nod]=0;
}
return;
}
sdf(nr[nod][s[poz]-'a'],poz+1,lung);
if(nrf[nod]==0 && ap[nod]==0)
{
nr[tata[nod]][val[nod]]=0;
nrf[tata[nod]]--;
tata[nod]=0;
val[nod]=0;
}
}
//aparitii apdf(1,0,strlen(s)-1);
void apdf(int nod,int poz,int lung)
{
if(poz==lung+1)
{
printf("%d\n",ap[nod]);
return;
}
if(!nr[nod][s[poz]-'a'])
{
printf("0\n");
return;
}
apdf(nr[nod][s[poz]-'a'],poz+1,lung);
}
//prefix prdf(1,0,strlen(s)-1);
void prdf(int nod,int poz,int lung)
{
if(poz==lung+1)
{
printf("%d\n",poz);
return;
}
if(!nr[nod][s[poz]-'a'])
{
printf("%d\n",poz);
return;
}
prdf(nr[nod][s[poz]-'a'],poz+1,lung);
}
void set(char s[X],char ch)
{
for(int i=0;i<X;i++)
s[i]=ch;
}
void read()
{
char x;
in;
out;
nrn=1;
s[0]='1';
while(scanf("%c",&x)!=EOF)
{
set(s,'\x0');
scanf("%s\n",&s);
if(x=='0')
adf(1,0,strlen(s)-1);
if(x=='1')
sdf(1,0,strlen(s)-1);
if(x=='2')
apdf(1,0,strlen(s)-1);
if(x=='3')
prdf(1,0,strlen(s)-1);
}
}
int main()
{
read();
return 0;
}