Cod sursa(job #2636223)

Utilizator isa_tudor_andreiAndrei Tudor isa_tudor_andrei Data 17 iulie 2020 12:26:01
Problema Trie Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

struct Trie{
  int nrfii, cnt;
  Trie* fiu[26];

  Trie () {
    nrfii = cnt = 0;
    memset(fiu, 0, sizeof(fiu));
  }
};

Trie *root = new Trie;
char line[25];

void ins( Trie* node, char *s ) {
  if( *s == '\0' ) {
    node->cnt ++;
    return ;
  }
  int ch = *s - 'a';
  if( node->fiu[ch] == 0 ) {
    node->fiu[ch] = new Trie;
    node->nrfii ++;
  }
  ins(node->fiu[ch], s + 1);
}

bool del( Trie* node, char *s ) {
  int ch = *s - 'a';
  if( *s == '\0' ) {
    node->cnt --;
  }
  else if( del(node->fiu[ch], s + 1) ) {
    node->fiu[ch] = 0;
    node->nrfii --;
  }
  if( node->nrfii == 0 && node->cnt == 0 && node != root ) {
    delete node;
    return true;
  }
  return false;
}

int ap( Trie* node, char* s ) {
  if( *s == '\0' )
    return node->cnt;
  int ch = *s - 'a';
  if( node->fiu[ch] != 0 )
    return ap(node->fiu[ch], s + 1);
  else
    return 0;
}

int prefix( Trie* node, char* s ) {
  int ch = *s - 'a';
  if( node->fiu[ch] == 0 )
    return 0;
  return 1 + prefix(node->fiu[ch], s + 1);
}

int main() {
    int op;
    while( fin>>op>>line ) {
      switch( op ) {
        case 0: ins( root, line ); break;
        case 1: del( root, line ); break;
        case 2: fout<<ap( root, line )<<"\n"; break;
        case 3: fout<<prefix( root, line )<<"\n"; break;
      }
    }
    return 0;
}