Cod sursa(job #2444099)

Utilizator StanCatalinStanCatalin StanCatalin Data 30 iulie 2019 12:45:02
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <iostream>
#include <fstream>

using namespace std;

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

struct nod{
  nod *c[26];
  int aparitii,prefixe;
  nod() {
    for (int i = 0; i < 26; i++) {
        c[i] = NULL;
    }
    aparitii = prefixe = 0;
  }
}*radacina;

void adauga(nod *&actual,string s)
{
    ///cerr << s << "\n";
    if (actual == NULL)
    {
        actual = new nod;
    }
    actual->prefixe++;
    if(s.length() == 0) {
        actual->aparitii++;
        return;
    }
    adauga(actual->c[s[0] - 'a'], s.substr(1));
}

void sterge(nod *&actual,string s)
{
    actual->prefixe--;
    if (s.length() == 0)
    {
        actual->aparitii--;
    } else
    {
        sterge(actual->c[s[0] - 'a'], s.substr(1));
    }
    if (actual->prefixe == 0 && actual != radacina) {
        delete actual;
        actual = NULL;
    }
}

int cnt_aparitii(nod *&actual,string s)
{
    if (actual == NULL)
    {
        return 0;
    }
    if (s.length() == 0)
    {
        return actual->aparitii;
    }
    return cnt_aparitii(actual->c[s[0] - 'a'], s.substr(1));
}

int cnt_prefix(nod *&actual,string s)
{
    if (actual == NULL)
    {
        return -1;
    }
    if (s.length() == 0)
    {
        return 0;
    }
    return 1 + cnt_prefix(actual->c[s[0] - 'a'], s.substr(1));
}

int main()
{

    int op;
    string s;

    while (in >> op >> s)
    {
        if (op == 0)
        {
            adauga(radacina,s);
        }
        if (op == 1)
        {
            sterge(radacina,s);
        }
        if (op == 2)
        {
            out << cnt_aparitii(radacina,s) << "\n";
        }
        if (op == 3)
        {
            out << cnt_prefix(radacina,s) << "\n";
        }
    }

    return 0;
}