Cod sursa(job #2416767)

Utilizator alex2kamebossPuscasu Alexandru alex2kameboss Data 28 aprilie 2019 10:10:58
Problema Trie Scor 5
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

struct trie{
    int ap, nrfii;
    trie *fii[26];
    trie(){
        ap = nrfii = 0;
        for(int i = 0; i < 26; ++i)
            fii[i] = NULL;
    }
}*r;

char a[50];
int c;

void adauga(trie *& nod, char* l){
    if(*l=='\n'){
        nod->ap++;
        return ;
    }

    if(nod->fii[*l-'a']==NULL){
        nod->fii[*l-'a'] = new trie();
        nod->nrfii++;
    }

    adauga(nod->fii[*l-'a'],l+1);
}

int apariti(trie *& nod, char *l){
    if(*l=='\n'){
        return nod->ap;
    }

    if(nod->fii[*l-'a']==NULL){
        return 0;
    }

    return apariti(nod->fii[*l-'a'],l+1);
}

int prefix(trie *& nod, char *l){
    if(nod == NULL || *l == '\n')
        return l-a;
    return prefix(nod->fii[*l-'a'], l+1);
}

bool sterge(trie *& nod, char *l){
    if(*l=='\n')
        nod->ap--;
    else{
        if(sterge(nod->fii[*l-'a'],l+1)){
            nod->fii[*l-'a'] = NULL;
            nod->nrfii--;
        }
    }

    if(nod->ap == 0 && nod->nrfii == 0 && nod!=r){
        delete nod;
        return 1;
    }
    return 0;
}

int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);

    r = new trie();

    while(scanf("%d ", &c)==1){
        fgets(a,50,stdin);
        if(c==0)
            adauga(r,a);
        else if(c==1)
            sterge(r,a);
        else if(c==2)
            cout<<apariti(r,a)<<"\n";
        else if(c==3)
            cout<<prefix(r,a)-1<<"\n";

    }

    return 0;
}