Cod sursa(job #2627006)

Utilizator euyoTukanul euyo Data 9 iunie 2020 12:34:25
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#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[21];
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;
}