Cod sursa(job #2882194)

Utilizator chriss_b_001Cristian Benghe chriss_b_001 Data 31 martie 2022 11:09:39
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#include <iostream>
#include <fstream>

using namespace std;

struct Nod
{
    int nrCuv, nrAp;
    Nod *F[26];

    Nod()
    {
        nrCuv = nrAp = 0;
        for(int i = 0; i < 26; i++)
            F[i] = NULL;
    }
};

Nod *Trie;

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

void Add(char *s) ///adaugare cuvant
{
    Nod *crt = Trie;
    for(; *s != '\0'; ++s)
    {
        int i = *s - 'a';
        if(crt->F[i] == NULL)
        {
            crt->F[i] = new Nod();
        }
        crt = crt->F[i];
        crt->nrAp++;
    }
    crt->nrCuv++;
}

int Count(char *s)
{
    Nod *crt = Trie;
    for(; *s != '\0'; ++s)
    {
        int i = *s - 'a';
        if(crt->F[i] == NULL)
            return 0;
        crt = crt->F[i];
    }
    return crt->nrCuv;
}

void Delete(char *s) ///s apare cel putin o data in lista de cuvinte
{
    Nod *crt = Trie, *ant;
    for(; *s != '\0'; s++)
    {
        int i = *s - 'a';
        ant = crt;
        crt = crt->F[i];
        crt->nrAp--;
        if(ant->nrAp == 0)
            delete ant;
        else
        {
            if(crt->nrAp == 0)
                ant->F[i] = NULL;
        }
    }
    crt->nrCuv--;
    if(crt->nrAp == 0)
    {
        delete crt;
    }
}

int Lcp(char *s) ///Lungimea celui mai lung prefix comun al lui s
{
    int i, lg = 0;
    Nod *crt = Trie;
    for(; *s != '\0' ; ++s)
    {
        i = *s - 'a';
        if(crt->F[i] == NULL)
            return lg;
        ++lg;
        crt = crt->F[i];
    }
    return lg;
}

int main()
{
    int op;
    char w[21];
    Trie = new Nod();
    Trie->nrAp = 1; ///Cuvantul vid
    while(f >> op >> w)
    {
        switch(op)
        {
        case 0:
            Add(w);
            break;
        case 1:
            Delete(w);
            break;
        case 2:
            g << Count(w) << '\n';
            break;
        case 3:
            g << Lcp(w) << '\n';
        }
    }
    return 0;
}