Cod sursa(job #2508778)

Utilizator radugheoRadu Mihai Gheorghe radugheo Data 12 decembrie 2019 23:20:55
Problema Trie Scor 5
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin  ("trie.in");
ofstream fout ("trie.out");

struct trie{
    int fii = 0;
    int cnt = 0;
    trie *f[30];
    trie () {
        for (int i=0; i<26; i++){
            f[i] = 0;
        }
    }
};

trie *rad;

int op;

char s[30];

void insereaza (trie *nod, char *s){
    if (*s != 0){
        if (nod->f[*s-'a'] == 0){
            nod->f[*s-'a'] = new trie;
            nod->fii++;
        }
        insereaza (nod->f[*s-'a'], s+1);
    }
    else{
        nod->cnt++;
    }
}

int sterge (trie *&nod, char *s){
    if (*s == 0){
        nod->cnt--;
        if (nod->cnt == 0 && nod->fii == 0 && nod != rad){
            delete nod;
            nod = NULL;
            return 1;
        }
    }
    else{
        if (sterge (nod->f[*s-'a'], s + 1)){
            nod->fii--;
            if (nod->cnt == 0 && nod->fii == 0 && nod != rad){
                delete nod;
                nod = NULL;
                return 1;
            }
        }
    }
    return 0;
}

int aparitii (trie *nod, char *s){
    if (*s == 0){
        return nod->cnt;
    }
    if (nod->f[*s-'a'] == NULL){
        return 0;
    }
    else{
        return aparitii(nod->f[*s-'a'], s + 1);
    }
}

int prefix (trie *nod, char *s){
    if (*s == 0){
        return nod->cnt;
    }
    if (nod->f[*s-'a'] == NULL){
        return 0;
    }
    else{
        return 1 + prefix(nod->f[*s-'a'], s + 1);
    }
}

int main(){
    rad = new trie;
    while (fin >> op >> s){
        if (op == 0){
            insereaza (rad, s);
        }
        if (op == 1){
            sterge (rad, s);
        }
        if (op == 2){
            fout << aparitii (rad, s) << "\n";
        }
        if (op == 3){
            fout << prefix (rad, s) << "\n";
        }
    }
    return 0;
}