Cod sursa(job #1216570)

Utilizator Vally77FMI Calinescu Valentin Gelu Vally77 Data 4 august 2014 23:45:02
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream ka("trie.in");
ofstream ki("trie.out");

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

void stergere(string s, nod* n, int poz)
{
    n->fii[s[poz]-'a'] = NULL;
    bool bun = false;
    for(int i = 0; i < 26 && !bun; i++)
        if(n->fii[i] != NULL)
            bun = true;
    if(!bun && n->aparitii == 0)
    {
        stergere(s, n->precedent, poz - 1);
        delete n;
    }
}

void adaugare(string s, int poz, nod* n, int a)
{
    if(poz == s.size())
    {
        if(a == 0)
            n->aparitii++;
        else if(a == 1)
        {
            n->aparitii--;
            if(n->aparitii == 0)
            {
                stergere(s, n->precedent, poz-1);
                delete 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)
{
    int continuari = 0;
    for(int i = 0; i < 26; i++)
        if(n->fii[i] != NULL)
            continuari++;
    if(continuari >= 2)
        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);
        }
    }
}