Cod sursa(job #2213776)

Utilizator PetyAlexandru Peticaru Pety Data 17 iunie 2018 13:05:32
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <bits/stdc++.h>

using namespace std;

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

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

int op;
string s;

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

void Scoate (string s) {
  nodTrie *p = root, *p1;
  for (int i = 0; i < s.size(); i++) {
    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 Numara (string s) {
  nodTrie *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 prefix (string s) {
  nodTrie *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 nodTrie;
  root -> ap = 1;
  while (fin >> op >> s) {
    if (op == 0)
      BagaLaArbore(s);
    if (op == 1)
      Scoate(s); /// pt. ca a fost baiat rau
    if (op == 2)
      fout << Numara(s) << "\n";
    if (op == 3)
      fout << prefix(s) << "\n";
  }
  return 0;
}