Cod sursa(job #1977734)

Utilizator DruffbaumPopescu Vlad Druffbaum Data 5 mai 2017 22:41:56
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <cstdio>
#include <cstring>

#define MAXALF 26
#define MAXLEN 25

struct trie {
  int cnt, nfii;
  trie *fii[MAXALF];
  trie() {
    cnt = nfii = 0;
    memset(fii, 0, sizeof(fii));
  }
};

trie *t = new trie;

void add(trie *nod, char *s) {
  if (*s == '\n') {
    ++nod->cnt;
    return;
  }
  if (!(nod->fii[*s - 'a'])) {
    ++nod->nfii;
    nod->fii[*s - 'a'] = new trie;
  }
  add(nod->fii[*s - 'a'], s + 1);
}

int del(trie *nod, char *s) {
  if (*s == '\n') {
    --nod->cnt;
  } else if (del(nod->fii[*s - 'a'], s + 1)) {
    nod->fii[*s - 'a'] = 0;
    --nod->nfii;
  }
  if (!(nod->nfii) && !(nod->cnt) && (nod != t)) {
    delete nod;
    return 1;
  }
  return 0;
}

int nrap(trie *nod, char *s) {
  if (*s == '\n') {
    return nod->cnt;
  }
  if (nod->fii[*s - 'a']) {
    return nrap(nod->fii[*s - 'a'], s + 1);
  }
  return 0;
}

int pref(trie *nod, char *s, int l = 0) {
  if (*s == '\n') {
    return l;
  }
  if (nod->fii[*s - 'a']) {
    return pref(nod->fii[*s - 'a'], s + 1, l + 1);
  }
  return l;
}

int main() {
  FILE *fin, *fout;
  char q[MAXLEN];
  fin = fopen("trie.in", "r");
  fgets(q, MAXLEN, fin);
  fout = fopen("trie.out", "w");
  while (!(feof(fin))) {
    switch (q[0]) {
      case '0': add(t, q + 2); break;
      case '1': del(t, q + 2); break;
      case '2': fprintf(fout, "%d\n", nrap(t, q + 2)); break;
      case '3': fprintf(fout, "%d\n", pref(t, q + 2)); break;
    }
    fgets(q, MAXLEN, fin);
  }
  fclose(fin);
  fclose(fout);
  return 0;
}