Cod sursa(job #3036334)

Utilizator MrPuzzleDespa Fabian Stefan MrPuzzle Data 24 martie 2023 10:33:35
Problema Trie Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.42 kb
#include<fstream>
#include<iostream>
#include<climits>
#include<algorithm>
#include<cstring>
#include<cmath>
#include <vector>
#include <queue>
#include <iomanip>
#include <bitset>
#include <deque>

#define DIM 20

using namespace std;

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

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

short op;
char s[DIM+5];

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

nod *rad;

void test(nod *adr,int ss[],int len){

    for(int i=1;i<=len;i++){
        cout<<char(ss[i]);
    }

    cout<<": "<<adr->cnt<<" "<<adr->fii<<'\n';

    len++;
    for(int i=0;i<26;i++){
        ss[len] = i+'a';
        if(adr->leg[i] != NULL){
            test(adr->leg[i],ss,len);
        }
    }
}


void inserare(nod *adr,char *s){
    if(*s == 0){
        adr->cnt++;
        return;
    }

    if(adr->leg[*s-'a'] == NULL){
        adr->leg[*s-'a'] = new nod;
        adr->fii++;
    }
    inserare(adr->leg[*s-'a'],s+1);
}

bool stergere(nod *adr,char *s){

    if(*s == 0){
        adr->cnt--;
        if(adr->cnt == 0){
            delete adr;
            return 1;
        }
        return 0;
    }

    if(stergere(adr->leg[*s-'a'],s+1)){
        adr->leg[*s-'a'] = NULL;
        adr->fii--;
        if(adr->fii == 0 && adr->cnt == 0 && adr != rad){
            delete adr;
            return 1;
        }

        return 0;
    }

    return 0;
}

int afisare(nod *adr,char *s){
    if(*s == 0){
        return adr->cnt;
    }

    if(adr->leg[*s-'a'] == NULL){
        return 0;
    }

    return afisare(adr->leg[*s-'a'],s+1);

}

int prefix(nod *adr,char *s,int len){
    if(*s == 0){
        return len;
    }

    if(adr->leg[*s-'a'] == NULL){
        return len;
    }

    return prefix(adr->leg[*s-'a'],s+1,len+1);
}

int main(){

    rad = new nod;

    while(f>>op){
        f>>s;

        if(op==0){
            inserare(rad,s);
        }else if(op==1){
            stergere(rad,s);
        }else if(op==2){
            g<<afisare(rad,s)<<'\n';
        }else{
            g<<prefix(rad,s,0)<<'\n';
        }

        /*int ss[1000];
        ss[0] = 0;
        test(rad,ss,0);
        cout<<'\n';*/
    }


    f.close();
    g.close();
    return 0;
}