Cod sursa(job #1808148)

Utilizator PletoPletosu Cosmin-Andrei Pleto Data 17 noiembrie 2016 13:41:00
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#include <fstream>
#include <string>
#include <cstring>

using namespace std;

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

int k=0;

struct trie{
    int nrFii;
    int _final;
    trie *V[26];
    trie(){
        nrFii = 0;
        _final = 0;
        memset(V, 0, sizeof(V));
    }
};

trie *T = new trie;

void _add(trie *T, char A[]){
    int N=strlen(A);
    for(int i=0; i<N; ++i){
        if(T->V[A[i]-'a'] == NULL){
            T->V[A[i]-'a'] = new trie;
            T->nrFii += 1;
        }
        T = T->V[A[i]-'a'];
    }
    T->_final += 1;
}

int _find(trie *T, char A[]){
    int N=strlen(A);
    for(int i=0; i<N; ++i){
        if(T->V[A[i]-'a'] == NULL)
            return 0;
        else T=T->V[A[i]-'a'];
    }
    return T->_final;
}

int _delete(trie *T, char A[]){
    if(A[0] == 0){
        if(T->_final > 1 || T->nrFii){
            T->_final--;
            return 0;
        }
        else{
            delete T;
            return 1;
        }
    }
    else{
        int X = _delete(T->V[A[0] - 'a'], A+1);
        if(X == 0){
            return 0;
        }
        else{
            T->V[A[0] - 'a'] = NULL;
            T->nrFii--;
            if(T->nrFii == 0 && T->_final == 0){
                delete T;
                return 1;
            }
            else{
                return 0;
            }
        }
    }
}

int _prefixComun(trie *T, char A[], int i=0){
    int N=strlen(A);
    for(; i<N; ++i){
        if(T->V[A[i]-'a'] == NULL)
            return i;
        else{
            T = T->V[A[i]-'a'];
        }
    }
    return i;
}

int main(){
    int test;
    char A[51];
    while(fin>>test>>A){
        if(!fin.eof()) continue;
        switch(test){
            case 0: _add(T, A);break;
            case 1: _delete(T, A);break;
            case 2: fout<<_find(T, A)<<'\n';break;
            case 3: fout<<_prefixComun(T, A)<<'\n';break;
        }
    }
    delete T;
    fin.close();
    fout.close();
    return 0;
}