Cod sursa(job #1615577)

Utilizator Darius15Darius Pop Darius15 Data 26 februarie 2016 18:00:46
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>
#include <cstring>

#define ic (c[i] - 'a')

using namespace std;

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

ifstream fin("trie.in");
ofstream fout("trie.out");
int op, dim;
string c;
Trie* T = new Trie;

void adauga (Trie* nod, int i) {
  if (i == dim) { // Am prelucrat tot cuvantul.
    nod->ap++;
    return;
  }
  if (nod->fiu[ic] == NULL) { // Acest fiu este neinitializat.
    Trie* a = new Trie;
    a->ap = 0; a->nrfii = 1;
    memset (a->fiu, 0, sizeof (a->fiu));
    nod->fiu[ic] = a;
  }
  adauga (nod->fiu[ic], i + 1); // Continuam cu trie care are ca radacina acest fiu.
}

bool sterge (Trie* nod, int i) {
  if (i == dim)
    nod->ap--;
  else
    if (sterge(nod->fiu[ic], i + 1)) {
      nod->fiu[ic] = NULL; nod->nrfii--;
    }
  if (nod->ap == 0 and nod->nrfii == 0 and nod != T) {
    delete nod;
    return true;
  }
  return false;
}

int aparitii (Trie *nod, int i) {
  if (i == dim)
    return nod->ap;
  if (nod->fiu[ic])
    return aparitii(nod->fiu[ic], i + 1);
  return 0;
}

int prefix (Trie *nod, int i) {
  if (i == dim or nod->fiu[ic] == NULL)
    return i;
  return prefix(nod->fiu[ic], i + 1);
}

int main () {
  while (fin >> op) {
    fin >> c;
    dim = c.size();
    switch (op) {
      case 0: adauga(T, 0); break;
      case 1: sterge(T, 0); break;
      case 2: fout << aparitii(T, 0) << '\n'; break;
      case 3: fout << prefix(T, 0) << '\n'; break;
    }
  }
}