Cod sursa(job #2519026)

Utilizator mirceaisherebina mircea mirceaishere Data 6 ianuarie 2020 22:23:13
Problema Trie Scor 35
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.36 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;
        }else{
            return 0;
        }
    }
    if(nod->f[*text-'a']){
        if(StergeCuvant(nod->f[*text-'a'], text+1)){
            nod->f[*text-'a']=NULL;
            nod->nrfii--;
            if(nod->nrcuvinte==0 && nod->nrfii==0 && nod!=radacina){
                delete nod;
                return 1;
            }else{
                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(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";
        }
    }
}