Cod sursa(job #3231571)

Utilizator alex_0747Gheorghica Alexandru alex_0747 Data 27 mai 2024 11:29:55
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.41 kb
#include <bits/stdc++.h>
using namespace std;

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

class Nod
{
private:
    int nr, cnt;
    Nod *leg[26];
public:
    Nod()
    {
        nr = cnt = 0;
        for (int i = 0; i < 26; i++)
            leg[i] = NULL;
    }
    void increment(){nr++;}
    void incrementcnt(){cnt++;}
    void decrement(){nr--;}
    void decrementcnt(){cnt--;}
    int info(){return nr;}
    int infocnt(){return cnt;}
    bool IsNULL(char ch) {return (leg[ch - 'a'] == NULL);}
    void LegaturaNoua(char ch) {leg[ch - 'a'] = new Nod;}
    Nod* Inainte(char ch){return leg[ch - 'a'];}
};

class Trie
{
private:
    Nod *rad;
public:
    Trie() {rad = new Nod;}
    void Adauga(string s)
    {
        Nod *p = rad;
        int n = s.length();
        p->incrementcnt();
        for (int i = 0; i < n; i++)
        {
            if (p->IsNULL(s[i])) p->LegaturaNoua(s[i]);
            p = p->Inainte(s[i]);
            p->incrementcnt();
        }
        p->increment();
    }
    void Sterge(string s)
    {
        Nod *p = rad;
        int i, n = s.length();
        for (i = 0; i < n && p != NULL; i++)
            p = p->Inainte(s[i]);
        if (i == n)
        {
            p = rad;
            p->decrementcnt();
            for (int i = 0; i < n && p != NULL; i++)
            {
                p = p->Inainte(s[i]);
                p->decrementcnt();
            }
            p->decrement();
        }
    }
    int Count(string s)
    {
        Nod *p = rad;
        int i, n = s.length();
        for (i = 0; i < n; i++)
        {
            if (p->IsNULL(s[i]))
                return 0;
            p = p->Inainte(s[i]);
        }
        return p->info();
    }
    int Prefix(string s)
    {
        Nod *p = rad;
        int i, lgmax = 0, n = s.length();
        for (i = 0; i < n; i++)
        {
            if (p->IsNULL(s[i]))
                return lgmax;
            p = p->Inainte(s[i]);
            if (p->infocnt() == 0)
                return lgmax;
            lgmax++;
        }
        return lgmax;
    }
};

Trie T;

int main()
{
    string s;
    int op;
    while (fin >> op)
    {
        fin >> s;
        if (op == 0) T.Adauga(s);
        else if (op == 1) T.Sterge(s);
        else if (op == 2) fout << T.Count(s) << "\n";
        else fout << T.Prefix(s) << "\n";
    }
    return 0;
}