Cod sursa(job #2338217)

Utilizator lucametehauDart Monkey lucametehau Data 7 februarie 2019 10:44:01
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#include <cstring>
#define ch (*s - 'a')

using namespace std;

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

int n, t;
char s[25];

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, char *s) {
  if(*s == NULL) {
    T->val++;
    return;
  }
  if(T->nxt[ch] == 0) {
    T->nxt[ch] = new Trie;
    T->nr++;
  }
  insert(T->nxt[ch], s + 1);
}

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

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

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

int main() {
  R = new Trie;
  while(cin >> t >> s) {
    if(t == 0)
      insert(R, s);
    else if(t == 1)
      erase(R, s);
    else if(t == 2)
      cout << query(R, s) << "\n";
    else
      cout << lcp(R, s, 0) << "\n";
  }
  return 0;
}