Cod sursa(job #1251568)

Utilizator IonSebastianIon Sebastian IonSebastian Data 29 octombrie 2014 17:47:48
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <cstdio>

FILE* in, *out;

using namespace std;

char cuv[21];

struct Nod {
    int nrp, nrc;
    Nod* fii[26];

    Nod()
    {
        nrp = nrc = 0;
        for(int i = 0; i < 26; i++)
            fii[i] = NULL;
    }
};

Nod* adauga(Nod*p,char* cuv)
{
    if(p == NULL)
        p = new Nod;
    p->nrp++;
    if(cuv[0] != 0)
        p->fii[cuv[0]-'a'] = adauga(p->fii[cuv[0]-'a'],cuv+1);
    else
        p->nrc++;
    return p;
}

Nod* sterge(Nod* p, char* cuv)
{
    p->nrp--;
    if(cuv[0] != 0)
        p->fii[cuv[0]-'a'] = sterge(p->fii[cuv[0]-'a'], cuv+1);
    else
        p->nrc--;
    if(p->nrc == 0)
    {
        delete p;
        p = NULL;
    }
    return p;
}

int howMany(Nod *p, char* cuv)
{
    int nr = 0;
    if(p == NULL) return 0;
    if(cuv[0] != 0)
    {
        nr = howMany(p->fii[cuv[0]-'a'],cuv+1);
    }
    else
        return p->nrc;
}

int prefix(Nod *p, char* cuv)
{
    if(p == NULL) return 0;
    int pref = p->nrp;
    if(cuv[0] != 0)
        if(p->fii[cuv[0]-'a'] != NULL)
            pref = 1 + prefix(p->fii[cuv[0]-'a'],cuv+1);
        else return 0;
    else
        return 0;
}

int main()
{
    in = fopen("trie.in","r");
    out = fopen("trie.out","w");
    Nod* p = NULL;
    int type;
    while(fscanf(in,"%d ", &type) != EOF)
    {
        fscanf(in, "%s\n", cuv);
        if(type == 0)
            p = adauga(p,cuv);
        else if(type == 1)
            p = sterge(p,cuv);
        else if(type == 2)
            fprintf(out, "%d\n", howMany(p,cuv));
        else fprintf(out, "%d\n", prefix(p,cuv));
    }
    return 0;
}