Cod sursa(job #2302162)

Utilizator ApostolIlieDanielApostol Daniel ApostolIlieDaniel Data 13 decembrie 2018 21:22:57
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <bits/stdc++.h>

using namespace std;

FILE *fin = fopen ("trie.in", "r"), *fout = fopen ("trie.out", "w");

const int MAXN = 100;



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

Trie *T = new Trie;

void update (Trie *nod, char *s) {
  if (*s == NULL) {
    nod->cnt++;
    return;
  }
  if (nod->fiu[*s - 'a'] == 0) {
    nod->fiu[*s - 'a'] = new Trie;
    nod->nr++;
  }
  update (nod->fiu[*s - 'a'], s + 1);
}

bool erase (Trie *nod, char *s) {
  if (*s == NULL) {
    nod->cnt--;
  }
  else if (erase (nod->fiu[*s - 'a'], s + 1)) {
    nod->nr--;
    nod->fiu[*s - 'a'] = 0;
  }
  if (nod->cnt == 0 && nod != T && nod->nr == 0) {
    delete nod;
    return 1;
  }
  return 0;
}

int query (Trie *nod, char *s) {
  if (*s == NULL)
    return nod->cnt;
  if (nod->fiu[*s - 'a'] == NULL)
    return 0;
  return query (nod->fiu[*s - 'a'], s + 1);
}

int prefix (Trie *nod, char *s, int k) {
  if (*s == NULL)
    return k;
  if (nod->fiu[*s - 'a'] == NULL)
    return k;
  return prefix (nod->fiu[*s - 'a'], s + 1, k + 1);
}
char s[MAXN + 1];
int main() {
  int op;
  while (fscanf (fin, "%d", &op) != EOF) {
    fscanf (fin, "%s", &s);
    if (op == 0) {
      update (T, s);
    }
    else if (op == 1) {
      bool _ = erase (T, s);
    }
    else if (op == 2) {
      fprintf (fout, "%d\n", query (T, s));
    }
    else {
      fprintf (fout, "%d\n", prefix (T, s, 0));
    }
  }
  fclose (fin);
  fclose (fout);
  return 0;
}