Cod sursa(job #2449684)

Utilizator Briana_NeaguNeagu Briana Briana_Neagu Data 20 august 2019 14:25:29
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.21 kb
#include <bits/stdc++.h>

using namespace std;

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

const int n = 26;
struct trie
{
    int fv, end;
    trie *next[26];
    trie()
    {
        this -> fv = 0;
        this -> end = 0;
        memset(this->next, NULL, sizeof(this->next));
    }
};

trie *root = new trie();

namespace task
{
  void add(trie *nod, string &sir, int i)
  {
      nod -> fv ++;
      if(i == sir.length())
          nod -> end ++;
      else
      {
         int next_letter = sir[i] - 'a';
         assert(next_letter >= 0 && next_letter <= 26);
         if (nod -> next[next_letter] == nullptr)
             nod -> next[next_letter] = new trie();
         add(nod -> next[next_letter], sir, i + 1);
      }
  }

  void erase(trie *&nod, string &sir, int i)
  {
      assert(nod -> fv !=0);
      nod -> fv --;
      if (i == sir.length())
          nod -> end --;
      else
      {
          int next_letter = sir[i] - 'a';
          assert(next_letter >= 0 && next_letter <= 26);
          assert(nod -> next[next_letter] != nullptr);
          erase(nod -> next[next_letter], sir, i + 1);
      }
      if (nod != root && nod -> fv == 0)
      {
          delete nod;
          nod = nullptr;
      }
  }

  int how_many(trie *nod, string &sir, int i)
  {
      assert(nod -> fv !=0);
      if (i == sir.length())
          return  nod -> end;
      int next_letter = sir[i] - 'a';
      if (nod -> next[next_letter] == nullptr)
          return 0;
      return how_many(nod -> next[next_letter], sir, i + 1);
  }

  int get_prefix(trie *nod, string &sir, int i)
  {
      assert(nod -> fv !=0);
      if (i < sir.length())
      {
          int next_letter = sir[i] - 'a';
          if (nod -> next[next_letter] != nullptr)
              return get_prefix(nod -> next[next_letter], sir, i + 1);
          else
              return i;
      }
      return i;
  }

}

int main()
{
    int op;
    string sir;
    while (f >> op >> sir)
    {
        if (op == 0)
            task :: add(root, sir, 0);
        else if (op == 1)
            task :: erase(root, sir, 0);
        else if (op == 2)
            g << task :: how_many(root, sir, 0) << '\n';
        else
            g << task :: get_prefix(root, sir, 0) << '\n';

    }
}