Pagini recente » Cod sursa (job #1370793) | Cod sursa (job #2502668) | Cod sursa (job #2265684) | Cod sursa (job #2750363) | Cod sursa (job #2626951)
#include <stdio.h>
#include <string.h>
#define A_SIZE 26
struct trie_node {
trie_node(): cnt(0), nf(0) {
memset( ch, 0, sizeof(ch) );
}
int cnt;
int nf;
trie_node *ch[A_SIZE];
};
char str[20];
int l;
trie_node *root;
void trie_add( trie_node *node, char *p ) {
if ( *p == 0 ) {
node->cnt++;
return;
}
int c = *p - 'a';
if (node->ch[c] == NULL) {
node->nf++;
node->ch[c] = new trie_node;
}
trie_add( node->ch[c], p + 1 );
}
trie_node* trie_delete( trie_node *node, char *p ) {
if ( *p == 0 ) {
node->cnt--;
} else {
int c = *p - 'a';
node->ch[c] = trie_delete( node->ch[c], p + 1 );
if (node->ch[c] == NULL) {
node->nf--;
}
}
if ( node->cnt == 0 && node->nf == 0 ) {
delete node;
return NULL;
}
return node;
}
int trie_search( trie_node *node, char *p ) {
if ( node == NULL ) {
return 0;
}
if ( *p == 0 ) {
return node->cnt;
}
int c = *p - 'a';
return trie_search( node->ch[c], p + 1 );
}
int trie_maxPref( trie_node *node, char *p, int d ) {
if ( node == NULL ) {
return d - 1;
}
if ( *p == 0 ) {
return d;
}
int c = *p - 'a';
return trie_maxPref( node->ch[c], p + 1, d + 1 );
}
int main() {
FILE *fin = fopen( "trie.in", "r" );
FILE *fout = fopen( "trie.out", "w" );
int type;
while ( fscanf( fin, "%d ", &type ) == 1 ) {
fscanf( fin, "%s", str );
l = strlen( str );
switch ( type ) {
case 0:
if ( root == NULL ) {
root = new trie_node;
}
trie_add( root, str );
break;
case 1:
trie_delete( root, str );
break;
case 2:
fprintf( fout, "%d\n", trie_search( root, str ) );
break;
case 3:
fprintf( fout, "%d\n", trie_maxPref( root, str, 0 ) );
break;
}
}
fclose( fin );
fclose( fout );
return 0;
}