Cod sursa(job #1905226)

Utilizator RaTonAndrei Raton RaTon Data 5 martie 2017 22:59:13
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.24 kb
#include <fstream>
#include <string>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");

typedef struct nod{
    int terminal;
    int nrcuv;//nr cuvintelor care trec prin nod
    struct nod *fiu[26];
}*TRIE, NOD;
TRIE T;
char CUV[21];

void add(TRIE &T, char *p){
    int i;
    if(T==NULL){
        T = new NOD;
        T->terminal = 0;
        T->nrcuv = 0;
        for( i = 0; i < 26; i++)
            T->fiu[i] = NULL;
        add(T,p);
    }
    else if( (*p) == '\0'){
        T->terminal++;
        T->nrcuv++;
    }
    else{
        T->nrcuv++;
        add(T->fiu[*(p)-'a'],p+1);
    }
}

void del(TRIE &T, char *p){
    if( (*p) == '\0' ){
        if( T->nrcuv > 1 ){
            T->terminal--;
            T->nrcuv--;
        }
        else
            delete(T);
    }
    else{
        del(T->fiu[(*p) - 'a'],p+1);
        if( T->nrcuv == 1 ){
            delete(T);
            T = NULL;
        }
        else{
            T->nrcuv--;
        }
    }
}

int nr_ap(TRIE T, char *p){

    if( (*p) == '\0')
        return T->terminal;
    if( T->fiu[(*p)-'a'] == NULL )
        return 0;
    else
        return nr_ap(T->fiu[(*p)-'a'],p+1);
}

int prefix(TRIE T, char *p){
    if((*p) == '\0' || T->fiu[(*p)-'a'] == NULL )
        return 0;
    return 1 + prefix(T->fiu[(*p)-'a'],p+1);
}

/*void afis(TRIE T,int k){// afisare trie
    if(T != NULL){
        int i;
        if(T->terminal > 0){
            CUV[k] = '\0';
            g << CUV << endl;
        }
        else{
            for(i = 0; i < 26; i++)
                if( T->fiu[i] != NULL ){
                    CUV[k] = char('a'+i);
                    afis(T->fiu[i],k+1);
                    CUV[k] = '\0';
                }
        }
    }
}*/

int main(){
    int v;
    f >> v >> CUV;
    while(!f.eof()){
        switch(v){
            case 0:
                add(T,CUV);
                break;
            case 1:
                del(T,CUV);
                break;
            case 2:
                g << nr_ap(T,CUV);
                break;
            case 3:
                g << prefix(T,CUV);
                break;
        }
        f >> v >> CUV;
    }
    return 0;
}