Cod sursa(job #2931029)

Utilizator victorzarzuZarzu Victor victorzarzu Data 30 octombrie 2022 12:57:51
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include <bits/stdc++.h>

#define N 100005

using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");

struct Trie {
  int number, nrFii;
  Trie* children[27];

  Trie() {
    nrFii = number = 0;
    memset(children, 0, sizeof(children));
  }
};

Trie *T = new Trie;

void insert(Trie *node, char *word) {
  if(!isalpha(*word)) {
    node->number++;
    return;
  }
  
  int next = *word - 'a';
  if(!(node->children[next])) {
    node->nrFii++;
    node->children[next] = new Trie;
  }
  insert(node->children[next], word + 1);
}

bool del(Trie *node, char *word) {
  int next = *word - 'a';

  if(!isalpha(*word)) {
    node->number--;
  } else if(del(node->children[next], word + 1)) {
    node->nrFii--;
    node->children[next] = 0;
  }
  
  if(node->nrFii == 0 && node->number == 0 && node != T) {
    delete node;
    return true;
  }

  return false;
}

int occ(Trie* node, char *word) {
  if(!isalpha(*word)) {
    return node->number;
  }
  int next = *word - 'a';
  if(node->children[next]) {
    return occ(node->children[next], word + 1);
  }
  return 0;
}

int prefix(Trie *node, char *word, int len) {
  if(!isalpha(*word) || !(node->children[*word - 'a'])) {
    return len;
  }
  return prefix(node->children[*word - 'a'], word + 1, len + 1);
}

void solve() {
  int x;
  char word[21];
  while(f>>x>>word) {
    if(!x) {
      insert(T, word);
    } else if(x == 1) {
      del(T, word);
    } else if(x == 2) {
      g<<occ(T, word)<<'\n';
    } else {
      g<<prefix(T, word, 0)<<'\n';
    }
  }
}

int main() {
  solve();  
  return 0;
}