Pagini recente » Cod sursa (job #1814938) | Cod sursa (job #2713679) | Cod sursa (job #2335244) | Cod sursa (job #2485154) | Cod sursa (job #234055)
Cod sursa(job #234055)
#include <cstdio>
#include <cstring>
using namespace std;
const int nr_lit = 'z'-'a'+1;
struct trie {
trie *p[nr_lit];
int value;
trie() { value = 0; memset(p, 0, sizeof(p)); }
} root;
void add( char* );
void del( char* );
void ask( char* );
void wtf( char* );
int main() {
freopen( "trie.in", "r", stdin );
freopen( "trie.out", "w", stdout );
while ( !feof(stdin) ) {
int op;
char buf[32];
scanf( "%d %s\n", &op, buf );
switch ( op ) {
case 0: add( buf ); break;
case 1: del( buf ); break;
case 2: ask( buf ); break;
case 3: wtf( buf );
}
}
return 0;
}
void add( char *s ) {
trie *p = &root;
int n = strlen( s );
for ( int i=0; i<n; p = p->p[ s[i++]-'a' ] )
if ( p->p[ s[i]-'a' ] == NULL )
p->p[ s[i]-'a' ] = new trie();
p -> value ++;
}
void cleanup( trie *p, char *s, int i, int n ) {
if ( i==n ) return;
cleanup( p->p[ s[i]-'a' ], s, i+1, n );
bool ok = true;
for ( int l = 0; l<nr_lit; ++l )
if ( p->p[ s[i]-'a']->p[l] != NULL )
ok = false;
if ( ok && p->p[ s[i]-'a']->value==0 ) {
delete p->p[ s[i]-'a'];
p->p[ s[i]-'a' ] = NULL;
}
}
void del( char *s ) {
trie *p = &root;
int n = strlen( s ), tmp[32];
for ( int i=0; i<n; p = p->p[ s[i++]-'a' ] ) {
if ( p->p[ s[i]-'a' ] == NULL )
return;
tmp[i] = p->value;
}
p -> value --;
cleanup( &root, s, 0, n );
}
void ask( char *s ) {
trie *p = &root;
int n = strlen( s );
for ( int i=0; i<n; p = p->p[ s[i++]-'a' ] )
if ( p->p[ s[i]-'a' ] == NULL )
return;
printf( "%d\n", p->value );
}
void wtf( char *s ) {
trie *p = &root;
int n = strlen( s ), i;
for ( i=0; i<n; p = p->p[ s[i++]-'a' ] )
if ( p->p[ s[i]-'a' ] == NULL )
break;
printf( "%d\n", i );
}