Cod sursa(job #2338197)

Utilizator lucametehauDart Monkey lucametehau Data 7 februarie 2019 10:32:48
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#include <cstring>
#define ch(poz) (s[poz] - 'a')

using namespace std;

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

char s[40];

struct Trie {
  int val, nr;
  Trie* nxt[26];
  Trie() {
    val = nr = 0;
    for(int i = 0; i < 26; i++)
      nxt[i] = 0;
  }
} *R;

void insert(Trie* T, int poz, int n) {
  if(poz == n) {
    T->val++;
    return;
  }
  if(T->nxt[ch(poz)] == 0) {
    T->nxt[ch(poz)] = new Trie;
    T->nr++;
  }
  insert(T->nxt[ch(poz)], poz + 1, n);
}

int erase(Trie *T, int poz, int n) {
  if(poz == n)
    T->val--;
  else if(erase(T->nxt[ch(poz)], poz + 1, n)) {
    T->nxt[ch(poz)] = 0;
    T->nr--;
  }
  if(!T->val && !T->nr && T != R) {
    delete T; return 1;
  }
  return 0;
}

int query(Trie* T, int poz, int n) {
  if(poz == n)
    return T->val;
  if(T->nxt[ch(poz)])
    return query(T->nxt[ch(poz)], poz + 1, n);
  return 0;
}

int lcp(Trie* T, int poz, int lg, int n) {
  if(poz == n || T->nxt[ch(poz)] == 0)
    return lg;
  return lcp(T->nxt[ch(poz)], poz + 1, lg + 1, n);
}

int main() {
  while(cin.getline(s, 31)) {
    int n = strlen(s);
    if(s[0] == '0')
      insert(R, 2, n);
    else if(s[0] == '1')
      erase(R, 2, n);
    else if(s[0] == '2')
      cout << query(R, 2, n) << "\n";
    else
      cout << lcp(R, 2, 0, n) << "\n";
  }
  return 0;
}