Cod sursa(job #1376885)

Utilizator IonSebastianIon Sebastian IonSebastian Data 5 martie 2015 19:19:12
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <cstdio>
#include <cstring>

FILE* in, *out;

using namespace std;

char cuv[21];

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

    Nod()
    {
        nrp = nrc = 0;
        memset(fii, 0, sizeof(fii));
    }
};

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

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

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

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

int maxim(int a, int b)
{
    return (a>b)?a:b;
}

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