Cod sursa(job #2300904)

Utilizator ImbuzanRaduImbuzan Radu ImbuzanRadu Data 12 decembrie 2018 12:23:02
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <iostream>
#include <fstream>
#include <string.h>

using namespace std;

struct Trie
{
    struct Trie *fiu[30] = {0};
    int terminal = 0, fr = 0;
};

int n;
char cuvant[21];
Trie* T = new Trie;

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

void adaugare(Trie* T, char* cuvant)
{
    if(*cuvant == 0)///Daca am ajuns la sfarsitul cuvantului
    {
        T->terminal++;
        return;
    }

    if(T->fiu[*cuvant - 'a'] == 0)
    {
        T->fiu[*cuvant - 'a'] = new Trie;
        T->fr++;
    }

    adaugare(T->fiu[*cuvant - 'a'],cuvant + 1);
}

void stergere(Trie *T, char* cuvant)
{
    if(*cuvant == 0)///Daca am ajuns la sfarsitul cuvantului
    {
        T->terminal--;
    }
    else
    {
        stergere(T->fiu[*cuvant - 'a'], cuvant + 1);
        if(T->fiu[*cuvant - 'a']->fr == 0 && T->fiu[*cuvant - 'a']->terminal == 0)
        {
            delete T->fiu[*cuvant - 'a'];
            T->fiu[*cuvant - 'a'] = 0;
            T->fr--;
        }
    }
}

void nrAparitii(Trie* T, char* cuvant)
{
    if(*cuvant == 0)///Daca am ajuns la sfarsitul cuvantului
    {
        g<<T->terminal<<'\n';
        return;
    }

    nrAparitii(T->fiu[*cuvant - 'a'],cuvant + 1);
}

int prefixMax(Trie* T, char* cuvant)
{
     if(*cuvant == 0 || T->fiu[*cuvant - 'a' ]== 0)///Daca am ajuns la sfarsitul cuvantului
        return 0 ;

    return 1 + prefixMax(T->fiu[*cuvant - 'a'],cuvant + 1);
}

int main()
{
    while(f>>n)
    {
        f>>cuvant;
        if(n == 0) adaugare(T, cuvant);
        if(n == 1) stergere(T, cuvant);
        if(n == 2) nrAparitii(T, cuvant);
        if(n == 3) g<<prefixMax(T, cuvant)<<'\n';
    }
    return 0;
}