#include <cstdio>
#include <cstring>
const int SIGMA = 26;
using namespace std;
class trie_tree {
private:
struct trie {
int cnt_words;
int cnt_children;
trie *children[SIGMA];
trie () {
cnt_words = NULL;
cnt_children = NULL;
for( int i = 0; i < SIGMA; i ++ )
children[i] = NULL;
}
} *Root = new trie;
void insert_word( trie *Node, char *String ) {
if( *String == 0 ) {
Node -> cnt_words ++;
return;
}
if( Node -> children[*String - 'a'] == NULL ) {
Node -> children[*String - 'a'] = new trie;
Node -> cnt_children ++;
}
insert_word( Node -> children[*String - 'a'], String + 1 );
return;
}
int delete_word( trie *Node, char *String ) {
if( *String == 0 ) Node -> cnt_words --; else
if( delete_word( Node -> children[*String - 'a'], String + 1 ) ) {
Node -> children[*String - 'a'] = NULL;
Node -> cnt_children --;
}
if( Node -> cnt_children == 0 && Node -> cnt_words == 0 && Node != Root ) {
delete Node;
return 1;
}
return 0;
}
int count_word( trie *Node, char *String ) {
if( *String == 0 )
return Node -> cnt_words;
if( Node -> children[*String - 'a'] != NULL )
return count_word( Node -> children[*String - 'a'], String + 1 );
return 0;
}
int longest_prefix( trie *Node, char *String, int prefix_length ) {
if( *String == 0 )
return prefix_length;
if( Node -> children[*String - 'a'] != NULL )
return longest_prefix( Node -> children[*String - 'a'], String + 1, prefix_length + 1 );
return prefix_length;
}
public:
void insert_word( char *String ) {
insert_word( Root, String );
return;
}
void delete_word( char *String ) {
delete_word( Root, String );
return;
}
int count_word( char *String ) {
return count_word( Root, String );
}
int longest_prefix( char *String ) {
return longest_prefix( Root, String, 0 );
}
};
trie_tree my_trie; char String[SIGMA]; int K;
int main () {
freopen( "trie.in" ,"r", stdin );
freopen( "trie.out","w", stdout );
while( scanf( "%d", &K ) ) {
scanf( "%s", String );
if( String[0] == 0 )
break;
switch( K ) {
case 0: {
my_trie.insert_word( String );
break;
}
case 1: {
my_trie.delete_word( String );
break;
}
case 2: {
printf( "%d\n", my_trie.count_word( String ) );
break;
}
case 3: {
printf( "%d\n", my_trie.longest_prefix( String ) );
break;
}
}
memset( String, 0, sizeof( String ) );
}
return 0;
}