Cod sursa(job #2572659)

Utilizator bogdanvladmihaiBogdan Vlad-Mihai bogdanvladmihai Data 5 martie 2020 13:44:28
Problema Trie Scor 5
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

const int ALPHA = 26;
const int MAX_N = 2e1 + 5;

struct Trie {
  int cnt, end_string;
  Trie *child[ALPHA];
  Trie() {
    cnt = end_string = 0;
    for (int i = 0; i < ALPHA; ++i) {
      child[i] = NULL;
    }
  }
};

char s[MAX_N];

Trie *root;

void trie_insert(char *s) {
  Trie *p;
  p = root;
  for (int i = 0; s[i] > 0; ++i) {
    if (p -> child[s[i] - 'a'] == NULL) {
      p -> child[s[i] - 'a'] = new Trie;
    }
    p = p -> child[s[i] - 'a'];
    ++p -> cnt;
  }
  ++p -> end_string;
}

void trie_delete(char *s, Trie *node) {
  if (s[0] == '\0') {
    --node -> end_string;
    return;
  }
  trie_delete(s + 1, node -> child[s[0] - 'a']);
  --node -> child[s[0] - 'a'] -> cnt;
  if (node -> child[s[0] - 'a'] -> cnt == 0) {
    delete node -> child[s[0] - 'a'];
    node -> child[s[0] - 'a'] = NULL;
  }
}

int count_trie_word(char *s) {
  Trie *p;
  p = root;
  for (int i = 0; s[i] > 0; ++i) {
    if (p -> child[s[i] - 'a'] == NULL) {
      return 0;
    }
    p = p -> child[s[i] - 'a'];
  }
  return p -> end_string;
}

int long_trie_pref(char *s) {
  Trie *p;
  p = root;
  for (int i = 0; s[i] > 0; ++i) {
    if (p -> child[s[i] - 'a'] == NULL) {
      return i;
    }
    p = p -> child[s[i] - 'a'];
  }
  return p -> cnt;
}

int main() {
  int op;
  root = new Trie;
  while (fin >> op) {
    fin >> s;
    if (op == 0) {
      trie_insert(s);
    } else if (op == 1) {
      trie_delete(s, root);
    } else if (op == 2) {
      fout << count_trie_word(s) << "\n";
    } else if (op == 3) {
      fout << long_trie_pref(s) << "\n";
    }
  }
  return 0;
}