Cod sursa(job #2518083)

Utilizator marinaoprOprea Marina marinaopr Data 4 ianuarie 2020 22:04:26
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.96 kb
#include <stdio.h>
#include <string.h>
#include <fstream>

using namespace std;

ifstream fin("trie.in");
FILE *fout = fopen("trie.out", "w");

char sir[25];
int op,lg;

struct trie
{
    int nrfii; int nrcuv; trie *fii[26];

    trie()
    {
        nrfii = nrcuv = 0;
        memset(fii, 0, sizeof(fii));
    }
} *rad = new trie;

void inserare(int poz, trie *nod)
{
    if(poz == lg)
    {
        nod->nrcuv++;
        return;
    }

    if(nod->fii[sir[poz]-'a'] == 0)
    {
        nod->nrfii++;
        nod->fii[sir[poz]-'a'] = new trie;
    }
    inserare(poz+1, nod->fii[sir[poz]-'a']);
}

bool eliminare(int poz, trie *nod)
{
    if(poz == lg)
        nod->nrcuv--;
    else
    {
        bool rasp = eliminare(poz+1, nod->fii[sir[poz]-'a']);
        if(rasp == 1)
        {
            nod->nrfii--;
            nod->fii[sir[poz]-'a'] = 0;
        }
    }

    if(nod->nrcuv == 0 and nod->nrfii == 0 and nod!=rad)
    {
        delete nod;
        return 1;
    }

    return 0;
}

void tiparire(int poz, trie *nod)
{
    if(poz == lg)
    {
        fprintf(fout, "%d\n", nod->nrcuv);
        return;
    }

    if(nod->fii[sir[poz]-'a'])
        tiparire(poz+1, nod->fii[sir[poz]-'a']);
    else
        fprintf(fout, "0\n");
}

int prefix(int poz, trie *nod)
{
    if(poz == lg)
        return lg;

    if(nod->fii[sir[poz]-'a'])
        return prefix(poz+1, nod->fii[sir[poz]-'a']);
    return poz;
}

int main()
{
    while(fin >> op)
    {
        fin.get();
        fin.get(sir, 22, '\n');
        fin.get();
        lg = strlen(sir);

        if(op == 0)
            inserare(0, rad);
        else
            if(op == 1)
                eliminare(0, rad);
            else
                if(op == 2)
                    tiparire(0, rad);
                else
                    fprintf(fout, "%d\n", prefix(0, rad));

    }

    fin.close();
    fclose(fout);
    return 0;
}