Cod sursa(job #1152190)

Utilizator thebest001Neagu Rares Florian thebest001 Data 24 martie 2014 16:28:25
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;

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

struct Trie {
  Trie *copii[27];
  int ncopii;
  int contor;
  Trie() {
    ncopii = contor = 0;
    memset(copii, 0, sizeof(copii));
  }
};
Trie *T;
void add(Trie *Tr, char *x) {
  if (*x == 0) {
    Tr->contor++;
    return;
  }
  if (Tr->copii[*x - 'a'] == 0) {
    Tr->copii[*x - 'a'] = new Trie();
    Tr->ncopii++;
  }
  add(Tr->copii[*x - 'a'], x + 1);
}

int del(Trie *Tr, char *x) {
  if (*x == 0) {
    Tr->contor--;
  } else {
    if (del(Tr->copii[*x - 'a'], x + 1)) {
      //am sters nod-ul
      Tr->copii[*x - 'a'] = 0;
      Tr->ncopii--;
    }
  }
  if (Tr->ncopii == 0 && Tr->contor == 0 && T != Tr) {
    delete Tr;
    return 1;
  }
  return 0;
}

int aparitii(Trie *Tr, char *x) {
  if (*x == 0)
    return Tr->contor;
  if (Tr->copii[*x-'a'])
    return aparitii(Tr->copii[*x - 'a'], x + 1);
  return 0;
}

int prefix(Trie *Tr, char *x, int k) {
  if (*x == 0 || Tr->copii[*x - 'a'] == 0)
    return k;
  return prefix(Tr->copii[*x - 'a'], x + 1, k + 1);
}
int main() {
  char str[30];
  int n;
  T = new Trie();
  in>>n>>str;
  do {
    if (n == 0){
      add(T, str);
    }

    if (n == 1) {
      del(T, str);
    }
    if (n == 2) {
      out<<aparitii(T, str)<<"\n";
    }
    if (n == 3) {
      out<<prefix(T, str, 0)<<"\n";
    }
    in>>n>>str;
  } while (in.good());
  return 0;
}