Pagini recente » Cod sursa (job #1788931) | Cod sursa (job #2084791) | Cod sursa (job #2290066) | Cod sursa (job #2364559) | Cod sursa (job #1218448)
#include <cstdio>
#include <cstring>
#define MAXLEN 20
#define SIGMA 26
char line[MAXLEN + 4];
struct Trie{
int nr, sons;
Trie *son[SIGMA];
Trie() {
nr = sons = 0;
for( int i = 0 ; i < SIGMA ; ++i )
son[i] = 0;
}
};
Trie *T = new Trie;
void add( char *s, Trie *nod ) {
if( *s == '\n' ) {
nod -> nr++;
return;
}
if( nod -> son[*s - 'a' ] == 0 ) {
nod -> son[*s - 'a' ] = new Trie;
nod -> sons++;
}
add( s + 1, nod -> son[*s - 'a' ] );
}
int del( char *s, Trie *nod ) {
if( *s == '\n' )
nod -> nr--;
else if( del( s + 1, nod -> son[*s - 'a' ] ) ) {
nod -> son[*s - 'a' ] = 0;
--nod -> sons;
}
if( nod -> nr == 0 && nod -> sons == 0 && nod != T ) {
delete nod;
return 1;
}
return 0;
}
int nrap( char *s, Trie *nod ) {
if( *s == '\n' )
return nod -> nr;
if( nod -> son[*s - 'a'] )
return nrap( s + 1, nod -> son[*s - 'a'] );
return 0;
}
int prefix( char *s, Trie *nod, int k ) {
if( *s == '\n' || nod -> son[*s - 'a'] == 0 )
return k;
return prefix( s + 1, nod -> son[*s - 'a'], k + 1 );
}
int main () {
FILE *f, *g;
f = fopen( "trie.in", "r" );
g = fopen( "trie.out", "w" );
fgets( line, MAXLEN + 4, f );
while( !feof( f ) ) {
switch( line[0] ) {
case '0':
add( line + 2, T );
break;
case '1':
del( line + 2, T );
break;
case '2':
fprintf( g, "%d\n", nrap( line + 2, T ) );
break;
case '3':
fprintf( g, "%d\n", prefix( line + 2, T, 0 ) );
break;
}
fgets( line, 32, f );
}
fclose( f );
fclose( g );
return 0;
}