Cod sursa(job #2673993)

Utilizator PetyAlexandru Peticaru Pety Data 18 noiembrie 2020 13:16:17
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>

using namespace std;

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

struct trie {
  int ap, fin;
  trie* fii[26];
  trie () {
    ap = fin = 0;
    for (int i = 0; i < 26; i++)
      fii[i] = NULL;
  }
}*root;

void add (string s) {
  trie* p = root;
  for (int i = 0; i < s.size(); i++) {
    if (p->fii[s[i] - 'a'] == NULL)
      p -> fii[s[i] - 'a'] = new trie;
    p = p-> fii[s[i] - 'a'];
    p->ap++;
  }
  p->fin++;
}

void Erase (string s) {
  trie *p = root;
  for (int i = 0; i < s.size(); i++)  {
    trie* p1 = p;
    p = p->fii[s[i] - 'a'];
    p->ap--;
    if (p1 -> ap == 0)
      delete p1;
    else if (p -> ap == 0)
      p1->fii[s[i] - 'a'] = NULL;
  }
  p->fin--;
  if (p->ap == 0)
    delete p;
}

int query1 (string s) {
  trie* p = root;
  for (int i = 0; i < s.size(); i++) {
    if (p->fii[s[i] - 'a'] == NULL)
      return 0;
    p = p-> fii[s[i] - 'a'];
  }
  return p->fin;
}
int query2 (string s) {
  trie* p = root;
  for (int i = 0; i < s.size(); i++) {
    if (p->fii[s[i] - 'a'] == NULL)
      return i;
    p = p-> fii[s[i] - 'a'];
  }
  return s.size();
}

int main()
{
  root = new trie;
  root->ap = 1;
  int ch;
  string s;
  while (fin >> ch >> s) {
    if (ch == 0)
      add(s);
    if (ch == 1)
      Erase(s);
    if (ch == 2)
      fout << query1(s) << "\n";
    if (ch == 3)
      fout << query2(s) << "\n";
  }
  return 0;
}