Cod sursa(job #1172727)

Utilizator CostanMiriamCostan Miriam CostanMiriam Data 17 aprilie 2014 23:19:51
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <fstream>
#include <cstring>

using namespace std;

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

char cuv[30];

int op,pref;

struct data {

    int nrc;
    int nrfii;

    data *lit[30];

    data() {
        nrc=nrfii=0;
        memset(lit,0,sizeof (lit));
    }
}*trie = new data;

void update (data *p, char *s) {

    if (*s==NULL) {
        p->nrc++;
        return;
    }
    if (p->lit[*s-'a']==0) {
        p->lit[*s-'a']=new data;
        p->nrfii++;
    }
    update (p->lit[*s-'a'],s+1);

}

bool del (data *p, char *s) {

    if (*s==NULL)
        p->nrc--;
    else {
        if (del(p->lit[*s-'a'],s+1)){
            p->lit[*s-'a']=0;
            p->nrfii--;
        }
    }
    if (p->nrc==0 && p->nrfii==0) {
        delete p;
        return 1;
    }
    return 0;
}

int query (data *p, char *s) {

    if (*s==NULL)
        return p->nrc;
    if (p->lit[*s-'a']!=NULL)
        return query (p->lit[*s-'a'],s+1);
    return 0;
}

void prefix (data *p, char *s) {
    if(*s==0 || p->lit[*s-'a']==0)
        return ;
    pref++;
    prefix(p->lit[*s-'a'],s+1);
}

int main () {

    while (fin>>op) {
        fin>>cuv;
        if (op==0)
            update(trie,cuv);
        else
            if (op==1)
                del(trie,cuv);
            else
                if(op==2)
                    fout<<query(trie,cuv)<<"\n";
                else {
                    pref=0;
                    prefix(trie,cuv);
                    fout<<pref<<"\n";
                }
    }

    return 0;
}