Cod sursa(job #2519038)

Utilizator mirceaisherebina mircea mirceaishere Data 6 ianuarie 2020 22:47:13
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.35 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");

struct trie{
    int nrcuvinte;
    int nrfii;
    trie *f[26];
    trie(){
        nrcuvinte=0;
        nrfii=0;
        for(int i=0; i<26; i++){
            f[i]=NULL;
        }
    }
};

int n, m, t, i, j;
char s[30];
trie *radacina;

void AdaugaCuvant(trie *nod, char *text){
    if(*text!=0){
        /// verific daca exista deja litera aceea, iar daca nu, o adaug
        if(nod->f[*text-'a']==NULL){
            nod->nrfii++;
            nod->f[*text-'a']=new trie;
        }
        AdaugaCuvant(nod->f[*text-'a'], text+1);
    }else{
        nod->nrcuvinte++;
    }
}

int StergeCuvant(trie *nod, char *text){
    if(*text==0){
        nod->nrcuvinte--;
        if(nod->nrcuvinte==0 && nod->nrfii==0 && nod!=radacina){
            delete nod;
            return 1;
        }
        return 0;
    }
    if(nod->f[*text-'a']==NULL){
        return 0;
    }
    if(StergeCuvant(nod->f[*text-'a'], text+1)){
        nod->nrfii--;
        nod->f[*text-'a']=NULL;
        if(nod->nrcuvinte==0 && nod->nrfii==0 && nod!=radacina){
            delete nod;
            return 1;
        }
        return 0;
    }
    return 0;
}

int NrAparitii(trie *nod, char *text){
    if(*text==0){
        return nod->nrcuvinte;
    }
    if(nod->f[*text-'a']==NULL){
        return 0;
    }
    return NrAparitii(nod->f[*text-'a'], text+1);
}

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


int main(){
    radacina=new trie;
    while(fin>>t){
        fin>>s;
        if(t==0){
            /// adauga o aparitie a cuvantului s in lista
            AdaugaCuvant(radacina, s);
        }
        if(t==1){
            /// sterge o aparitie a cuvantului s din lista
            StergeCuvant(radacina, s);
        }
        if(t==2){
            /// tipareste numarul de aparitii ale cuvantului s in lista
            fout<<NrAparitii(radacina, s)<<"\n";
        }
        if(t==3){
            /// tipareste lungimea celui mai lung prefix comun al lui w cu oricare cuvant din lista
            fout<<LungimePrefix(radacina, s)<<"\n";
        }
    }
}