Cod sursa(job #2721812)

Utilizator Y.MalmsteenB.P.M. Y.Malmsteen Data 12 martie 2021 11:57:35
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <fstream>

using namespace std;

struct Trie
{
    int nrCuv,
        nrFii;
    Trie *Fiu[26];

    Trie()
    {
        nrCuv = nrFii = 0;
        for(int i = 0; i < 26; i++)
            Fiu[i] = NULL;
    }
};

Trie *T;

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

void Add(Trie *nod, char *s)
{
    if(*s == '\0')
        nod->nrCuv++;
    else
    {
        int i = *s - 'a';
        if(nod->Fiu[i] == NULL)
        {
            nod->Fiu[i] = new Trie();
            nod->nrFii++;
        }
        Add(nod->Fiu[i], s + 1);
    }
}

bool Delete(Trie *nod, char *s)
{
    if(*s == '\0')
        nod->nrCuv--;
    else
    {
        int i = *s - 'a';
        if(Delete(nod->Fiu[i], s + 1))
        {
            nod->Fiu[i] = NULL;
            nod->nrFii--;
        }
    }
    if(nod->nrCuv == 0 && nod->nrFii == 0 && nod != T)
    {
        delete nod;
        return 1;
    }
    return 0;
}

int Count(Trie *nod, char *s)
{
    if(*s == '\0')
        return nod->nrCuv;
    int i = *s - 'a';
    if(nod->Fiu[i])
        return Count(nod->Fiu[i], s + 1);
    return 0;
}

int Lcp(Trie *nod, char *s, int k)
{
    if(*s == '\0')
        return k;
    int i = *s - 'a';
    if(nod->Fiu[i] == 0)
        return k;
    return Lcp(nod->Fiu[i], s + 1, k + 1);
}

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