Cod sursa(job #2611803)

Utilizator mjmilan11Mujdar Milan mjmilan11 Data 7 mai 2020 16:43:11
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
const int NMAX = 25;
char c[NMAX];
int operatie;

struct Nod_Trie{
    int cnt,nr_fii;
    Nod_Trie *fii[26];
    Nod_Trie(){
        cnt=nr_fii=0;
        for(int i=0;i<=26;i++)
            fii[i]=NULL;
    }
};

Nod_Trie *root = new Nod_Trie;

void Insert(Nod_Trie *nod,char *s)
{
    if(*s==0){
        nod->cnt++;
        return;
    }
    int letter = *s - 'a';
    if(nod->fii[letter]==NULL){
        nod->nr_fii++;
        nod->fii[letter] = new Nod_Trie;
    }
    Insert(nod->fii[letter],s+1);
}

bool Delete(Nod_Trie *nod,char *s)
{
    if(*s==0){
        (nod->cnt)--;
    } else {
        int letter = *s - 'a';
        bool verif = Delete(nod->fii[letter],s+1);
        if(verif==true){
            nod->fii[letter] = NULL;
            nod->nr_fii--;
        }
    }
    if(nod->nr_fii == 0 and nod->cnt == 0 and nod!=root){
        delete nod;
        return 1;
    }
    return 0;
}

int Cerinta_2(Nod_Trie *nod,char *s){
    if(*s==0) return (nod->cnt);
    int letter = *s - 'a';
    if(nod->fii[letter]!=NULL) return Cerinta_2(nod->fii[letter],s+1);
    return 0;
}

int Cerinta_3(Nod_Trie *nod,char *s,int adancime){
    int letter = *s-'a';
    if(*s==0 or nod->fii[letter]==0) return adancime;
    return Cerinta_3(nod->fii[letter],s+1,adancime+1);
}


int main()
{
    while(fin >> operatie >> c){
        if(operatie==0) Insert(root,c);
        if(operatie==1) Delete(root,c);
        if(operatie==2) fout << Cerinta_2(root,c) << '\n';
        if(operatie==3) fout << Cerinta_3(root,c,0) << '\n';
    }
    return 0;
}