Cod sursa(job #2352850)

Utilizator al3xionescuIonescu Alexandru al3xionescu Data 23 februarie 2019 18:23:42
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <iostream>
#include <fstream>
using namespace std;
ofstream fo("trie.out");
ifstream fi("trie.in");
struct Trie {
    short NrCuv = 0;
    int frecventa = 0;
    struct Trie *fii[26] = {0};
};
int loc(char cuvant) {
    return cuvant - 'a';
}
void Adauga(Trie *T, char *cuvant) {
    if (*cuvant == 0) {
        T -> NrCuv++;
        return;
    }
    if (T -> fii[loc(*cuvant)] == 0) {
        T -> fii[loc(*cuvant)] = new Trie;
        T -> frecventa++;
    }
    Adauga(T -> fii[loc(*cuvant)], cuvant + 1);
}
void Stergere(Trie *t, char *cuvant) {
    if (*cuvant == 0) {
        T -> NrCuv--;
        return;
    }
    Stergere(T->fii[loc(*cuvant)],cuvant+1);
    if(T->fii[loc(*cuvant)]->frecventa==0 &&  T->fii[loc(*cuvant)]->NrCuv==0)
    {
        delete T->fii[loc(*cuvant)];
        T->fii[loc(*cuvant)]=0;
        T->frecventa--;
    }
}
int nrAparitii(Trie *T, char *cuvant)
{
    while(*cuvant!=0 && T->fii[loc(*cuvant)]!=0)
    {
        T=T->fii[loc(*cuvant)];
        cuvant=cuvant+1;
    }
    if(*cuvant==0)
        return T->NrCuv;
    if(T->fii[loc(*cuvant)]==0)
        return 0;
    return 0;
}
 
int PrefixMax(Trie *T, char *cuvant)
{
    int sol=0;
    while(*cuvant!=0 && T->fii[loc(*cuvant)]!=0)
    {
        ++sol;
        T=T->fii[loc(*cuvant)];
        cuvant=cuvant+1;
    }
    return sol;
}
int n;
char cuvant[20];
Trie *T;
int main() {
    T = new Trie;
    while(fi >> n) {
        fi >> cuvant;
        if (n == 0) Adauga(T, cuvant);
        if (n == 1) Stergere(T, cuvant);
        if (n == 2) fo << nrAparitii(T, cuvant) << '\n';
        if (n == 3) fo << PrefixMax(T, cuvant) << '\n';
    }
    fo.close();
    fi.close();
    return 0;
}