Pagini recente » Cod sursa (job #2611586) | Cod sursa (job #447061) | Cod sursa (job #589598) | Cod sursa (job #2963355) | Cod sursa (job #1231518)
#include <cstdio>
#include <cstring>
using namespace std;
struct Trie {
int cnt, nrsons;
Trie *son[ 26 ];
Trie() {
cnt = nrsons = 0;
memset( son, 0, sizeof( son ) );
}
};
Trie *T = new Trie;
void ins( Trie *node, char *s ) {
if( *s == '\n' ) {
node->cnt ++; return;
}
if( node->son[ *s - 'a' ] == 0 ) {
node->son[ *s - 'a' ] = new Trie;
node->nrsons ++;
}
ins( node->son[ *s-'a' ], s+1 );
}
int del( Trie *node, char *s ) {
if( *s == '\n' )
node->cnt --;
else if( del( node->son[ *s-'a' ], s+1 ) ) {
node->son[ *s-'a' ] = 0;
node->nrsons --;
}
if( node->cnt == 0 && node->nrsons == 0 && node != T ) {
delete node; return 1;
}
return 0;
}
int que( Trie *node, char *s ) {
if( *s == '\n' )
return node->cnt;
if( node->son[ *s-'a' ] )
return que( node->son[ *s-'a' ], s+1 );
return 0;
}
int pre( Trie *node, char *s, int k ) {
if( *s == '\n' || node->son[ *s-'a' ] == 0 )
return k;
return pre( node->son[ *s-'a' ], s+1, k+1 );
}
int main() {
char line[ 32 ];
freopen( "trie.in", "r", stdin );
freopen( "trie.out", "w", stdout );
fgets( line, 32, stdin );
while( !feof( stdin ) ) {
switch( line[0] ) {
case '0': ins( T, line+2 ); break;
case '1': del( T, line+2 ); break;
case '2': printf( "%d\n", que( T, line+2 ) ); break;
case '3': printf( "%d\n", pre( T, line+2, 0 ) ); break;
}
fgets( line, 32, stdin );
}
return 0;
}