Cod sursa(job #2429766)

Utilizator alex.cojocaruAlex Cojocaru alex.cojocaru Data 11 iunie 2019 08:56:10
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.9 kb
#include <iostream>
#include <stdio.h>
#include <cstring>

#define LMAX 20

using namespace std;

char s[LMAX] ;

struct Trie {
  Trie* fiu[26] ;
  int cnt ;
  int nrfii ;
  Trie() {
    cnt = nrfii = 0 ;
    memset(fiu, 0, sizeof(fiu));
  }
};

Trie* tri = new Trie ;

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

char del (Trie* tr, char *s ) {
  if (*s == '\0' )
    tr->cnt--;
  else {
    if ( del(tr->fiu[*s-'a'], s+1) == 1 ) {
      tr->nrfii--;
      tr->fiu[*s-'a'] = 0 ;
    }
  }
  if (tr->cnt == 0 && tr->nrfii == 0 && tr != tri ) {
    delete tr ;
    return 1 ;
  }
  return 0 ;
}

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

int querry2 (Trie* tr, char *s, int k ) {
  if (*s == '\0' || tr->fiu[*s-'a'] == 0 )
    return k ;
  else
    return querry2 (tr->fiu[*s-'a'], s+1, k+1 ) ;
}

void citeste (char *s, FILE* fin ) {
  char c ;
  c = fgetc(fin) ;
  while (c != '\n' ) {
    *s = c ;
    c = fgetc(fin) ;
    s++;
  }
  *s = '\0' ;
}
int main() {

  FILE *fin = fopen ("trie.in", "r" ) ;
  FILE *fout = fopen ("trie.out", "w" ) ;
  short int op ;
  while (fscanf(fin, "%hd", &op ) == 1 ) {
    fgetc(fin) ;
    citeste(s, fin) ;
    switch (op) {
      case 0 : {
        ins(tri, s) ;
        break ;
      }
      case 1 : {
        del(tri, s) ;
        break ;
      }
      case 2 : {
        fprintf (fout, "%d\n", querry1(tri, s) ) ;
        break ;
      }
      case 3 : {
        fprintf (fout, "%d\n", querry2(tri, s, 0) ) ;
        break ;
      }
    }
  }
  fclose(fin) ;
  fclose(fout) ;
  return 0;
}