#include <bits/stdc++.h>
using namespace std ;
ifstream in ("trie.in") ;
ofstream out ("trie.out") ;
struct nod
{
int cnt = 1 , nr = 0 ;
nod *son[ 30 ] = {0} ;
};
nod *T ;
void ins ( string s )
{
int x ;
nod *p , *q ;
p = T ;
for ( size_t i = 0 ; i < s.size() ; ++ i )
{
x = s [ i ] - 'a' ;
if ( p->son[ x ] )
{
p = p -> son [ x ] ;
p->cnt ++ ;
}
else
{
q = new nod ;
p->son [ x ] = q ;
p = p -> son [ x ] ;
}
}
p->nr ++ ;
}
void del ( string s )
{
int x ;
nod *p ;
p = T ;
for ( size_t i = 0 ; i < s.size() ; ++ i )
{
x = s [ i ] - 'a' ;
p=p->son[ x ] ;
p->cnt -- ;
}
p->nr -- ;
}
void nrap ( string s )
{
int x ;
nod *p ;
p = T ;
for ( size_t i = 0 ; i < s.size() ; ++ i )
{
x = s [ i ] - 'a' ;
if ( !p->son[x] || !p->son[x]->cnt )
{
out << "0\n" ;
return ;
}
p = p->son [ x ] ;
}
out << p->nr << '\n' ;
}
void task ( string s )
{
int x , sol = 0 ;
nod *p ;
p = T ;
for ( size_t i = 0 ; i < s.size() ; ++ i )
{
x = s [ i ] - 'a' ;
if ( !p->son[x] || !p->son[x]->cnt )
{
out << sol << "\n" ;
return ;
}
sol ++ ;
p = p-> son [ x ] ;
}
out << sol << '\n' ;
}
int main ()
{
string s ;
int tip ;
T = new nod ;
while ( in >> tip >> s )
{
if ( tip == 0 ) ins ( s ) ;
if ( tip == 1 ) del ( s ) ;
if ( tip == 2 ) nrap ( s ) ;
if ( tip == 3 ) task ( s ) ;
}
}