Cod sursa(job #1216722)

Utilizator Vally77FMI Calinescu Valentin Gelu Vally77 Data 5 august 2014 16:07:56
Problema Trie Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream ka("trie.in");
ofstream ki("trie.out");

struct nod
{
    int aparitii, urmatoare;
    nod* fii[26];
    nod* precedent;

    nod() {
        aparitii = 0;
	 urmatoare = 0;
	 for(int i = 0; i < 26; i++)
	 	fii[i] = NULL;
	 precedent = NULL;
    }
};


void stergere(string s, int poz, nod* n)
{
    if(poz >= 0 && n->urmatoare == 0)
    {
        n->precedent->fii[s[poz]- 'a'] = NULL;
        stergere(s, poz - 1, n->precedent);
        delete n;
    }
}

void adaugare(string s, int poz, nod* n, int a)
{
    if(a == 0)
        n->urmatoare++;
    else if(a == 1)
        n->urmatoare--;
    if(poz == s.size())
    {
        if(a == 0)
            n->aparitii++;
        else if(a == 1)
        {
            n->aparitii--;
            if(n->aparitii == 0)
            {
                stergere(s, poz, n);
            }
        }
        else if(a == 2)
            ki << n->aparitii << '\n';
    }
    else if(n->fii[s[poz]-'a'] != NULL)
    {
        adaugare(s, poz + 1, n->fii[s[poz]-'a'], a);
    }
    else
    {
        if(a == 0)
        {
            nod* nn = new(nod);
            nn->precedent = n;
            n->fii[s[poz]-'a'] = nn;
            adaugare(s, poz + 1, n->fii[s[poz]-'a'], a);
        }
        else if(a == 2)
            ki << 0 << '\n';
    }
}

void prefix(string s, int poz, nod* n)
{
    if(n->fii[s[poz]-'a'] != NULL)
        prefix(s, poz + 1, n->fii[s[poz]-'a']);
    else
        ki << poz << '\n';
}

int main()
{
    int a;
    string s;
    nod* radacina = new(nod);
    while(ka >> a >> s)
    {
        if(a == 0)
        {
            adaugare(s, 0, radacina, 0);
        }
        else if(a == 1)
        {
            adaugare(s, 0, radacina, 1);
        }
        else if(a == 2)
        {
            adaugare(s, 0, radacina, 2);
        }
        else
        {
            prefix(s, 0, radacina);
        }
    }
}