Cod sursa(job #1376793)

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

using namespace std;

FILE *in, *out;

struct Trie {
    int cnt, nrfii;
    Trie *fii[26];

    Trie()
    {
        cnt = nrfii = 0;
        memset(fii, 0, sizeof(fii));
    }
};

Trie *T = new Trie();

void add(Trie *nod, char* s)
{
    if(*s == '\n' || *s == '\0')
    {
        nod->cnt++;
        return;
    }

    if(nod->fii[*s-'a'] == 0)
    {
        nod->fii[*s-'a'] = new Trie();
        nod->nrfii++;
    }
    add(nod->fii[*s-'a'], s+1);
}

bool sterg(Trie* nod, char *s)
{
    if(*s == '\n' || *s == '\0')
    {
        nod->cnt--;
    } else if(sterg(nod->fii[*s-'a'],s+1) == true)
    {
        nod->fii[*s-'a'] = 0;
        nod->nrfii--;
    }
    if(nod->cnt == 0 && nod->nrfii == 0 && nod != T)
    {
        delete nod;
        return true;
    }
    return false;
}

int query(Trie *nod, char *s)
{
    if(*s == '\n' || *s == '\0')
        return nod->cnt;
    if(nod->fii[*s-'a'] > 0)
        return query(nod->fii[*s-'a'], s+1);
    return 0;
}

int prefix(Trie *nod, char *s, int lung)
{
    if(*s == '\n' || *s == '\0' || nod->fii[*s-'a'] == 0)
        return lung;
    return prefix(nod->fii[*s-'a'], s+1, lung+1);
}

int main()
{
    in = fopen("trie.in", "r");
    out = fopen("trie.out","w");
    char cuv[24];
    fgets(cuv,24,in);
    while(!feof(in))
    {
        if(cuv[0] == '0') add(T, cuv+2);
        else if(cuv[0] == '1') sterg(T, cuv+2);
        else if(cuv[0] == '2') fprintf(out, "%d\n", query(T, cuv+2));
        else fprintf(out, "%d\n", prefix(T, cuv+2, 0));
        fgets(cuv,24,in);
    }
    fclose(in);
    fclose(out);
    return 0;
}