Cod sursa(job #2018449)

Utilizator caesar2001Stoica Alexandru caesar2001 Data 4 septembrie 2017 21:59:40
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <iostream>
#include <cstdio>

using namespace std;

FILE *in, *out;

const int litmax = 26;
const int nmax = 20;

struct Trie {
  int pref; //drumul de la radacina pana in acest nod este prefix pentru $pref cuvinte
  Trie* son[litmax]; //son[0] corespunde sagetii cu litera 'A'. son[1] .. cu liter B...
};

Trie* root;

void addtrie(Trie* node, char* cuv) {
  node -> pref ++;
  if(*cuv != '\0') {
    int pos = *cuv - 'a';
    if(node -> son[pos] == NULL) {
      node -> son[pos] = new Trie();
      node -> son[pos] -> pref = 0;
    }
    addtrie(node -> son[pos], cuv + 1);
  }
}

void deltrie(Trie* node, char* cuv) {
  node -> pref --;
  if(*cuv != '\0') {
    int pos = *cuv - 'a';
    deltrie(node -> son[pos], cuv + 1);
  }
}

int aparitii(Trie* node, char* cuv) {
  if(*cuv != '\0') {
    int pos = *cuv - 'a';
    return aparitii(node -> son[pos],cuv + 1);
  } else {
    int answer = node->pref;
    for(int i = 0; i < litmax; i++)
      if(node -> son[i] != NULL)
        answer -= (node -> son[i] -> pref);
    return answer;
   }
}

int prefix(Trie* node, char* cuv, int lung = 0) {
  if(*cuv != '\0') {
    int pos = *cuv - 'a';
    if(node -> son[pos] != NULL && node -> son[pos] -> pref > 0)
      lung = prefix(node -> son[pos], cuv+1, lung + 1);
  }
  return lung;
}

int main() {
  in   = fopen("trie.in", "r");
  out = fopen("trie.out", "w");
  int op;
  char cuv[nmax + 3];

  root = new Trie();
  while(fscanf(in,"%d %s", &op, &cuv) != EOF) {
     if(op == 0)
       addtrie(root, cuv);
     else if(op == 1)
       deltrie(root, cuv);
     else if(op == 3)
       fprintf(out, "%d\n", prefix(root, cuv));
     else if(op == 2)
       fprintf(out,"%d\n", aparitii(root,cuv));
  }
  return 0;
}