Cod sursa(job #3274207)

Utilizator CaldareaCiprianCaldarea Ciprian CaldareaCiprian Data 5 februarie 2025 18:15:07
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.97 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>

using namespace std;

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


struct Nod
{
    int nrCuv, nrSons;
    Nod* son[26];

    Nod()
    {
        nrCuv = 0;
        nrSons = 0 ;
        memset(son, 0, sizeof(son));
    }
};

Nod* T = new Nod;

string s;

void Add(Nod* id, int poz)
{
    if (poz == s.size())
    {
        id->nrCuv++;
        return;
    }

    if (id->son[s[poz] - 'a'] == 0)
    {
        id->son[s[poz] - 'a'] = new Nod;
        id->nrSons++;
    }

    Add(id->son[s[poz] - 'a'], poz + 1);

}

bool Del(Nod* id, int poz)
{
    if (poz == s.size())
        id->nrCuv--;
    else
    {
        if (Del(id->son[s[poz] - 'a'], poz + 1))
        {
            id->nrSons--;
            id->son[s[poz] - 'a'] = 0;
        }
    }


    if (id != T && id->nrCuv == 0 && id->nrSons == 0)
    {
        delete id;
        return true;
    }

    return false;
}

int Count(Nod* id, int poz)
{
    if (poz == s.size())
    {
        return id->nrCuv;
    }

    if (id->son[s[poz] - 'a'] == 0)
        return 0;
    else
        return Count(id->son[s[poz] - 'a'], poz + 1);
}

int Prefix(Nod* id, int poz)
{
    if (poz == s.size())
        return poz;

    if (id->son[s[poz] - 'a'] == 0)
        return poz;
    else
        return Prefix(id->son[s[poz] - 'a'], poz + 1);
}
int main()
{
    int cer;

    while (fin >> cer >> s)
    {
        if (cer == 0)
        {
            Add(T, 0);
            continue;
        }

        if (cer == 1)
        {
            Del(T, 0);
            continue;
        }

        if (cer == 2)
        {
            fout << Count(T, 0) << '\n';
            continue;
        }

        if (cer == 3)
        {
            fout << Prefix(T, 0) << '\n';
            continue;
        }
    }
}