Cod sursa(job #1472543)

Utilizator alex_ovidiunituAlex Ovidiu Nitu alex_ovidiunitu Data 17 august 2015 12:29:06
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.25 kb
#include <iostream>
#include <stack>
#include <fstream>
#include <cstring>
#define alphabet 28
using namespace std;
fstream f,g;
char cuv[26];
struct trie
{
    int cuvinte, nrFii;
    trie *urm[alphabet];
    trie ()
    {
        nrFii = 0 ;
        cuvinte = 0;
        int i;
        for(i = 0 ; i < alphabet ; i++)
            urm[i] = NULL;
    }
    bool operator = ( trie *a)
    {
        cuvinte = a->cuvinte;
        nrFii = a->nrFii;
        int i;
        for(i = 0 ; i < alphabet ; i++)
            urm[i] = a->urm[i];
        return 1;
    }
};
trie *rad;
void adauga()
{
    unsigned int i;
    trie *p,*q;
    p = rad;
    for (i = 0 ; i< strlen(cuv); i++)
    {
        if ( p-> urm[cuv[i]-'a'] == NULL) // fac fiu nou
            {
                p->nrFii++;
                p->urm[cuv[i]-'a'] = new trie();
            }
        p = p->urm[cuv[i]-'a'];
    }
    p->cuvinte++;
}
void sterge ()
{
    int indice = 0;
    trie *p = rad->urm[cuv[indice++]-'a'];
    stack <trie*> s;
    s.push(rad);
    s.push(p);
    while(indice < strlen(cuv))
    {
        p = p->urm[cuv[indice++]-'a'];
        s.push(p);
    }
    p = s.top();
    p->cuvinte--;
    while(!s.empty())
    {
        p = s.top();
        s.pop();
        indice--;
        if (p == rad) break;
        if (p->cuvinte == 0 && p->nrFii == 0)
        {
            delete p;
            s.top() -> urm[cuv[indice]-'a'] = NULL;
            s.top()->nrFii--;

        }
    }
}
int apariti()
{
    unsigned int i;
    trie *p=rad;
    for (i = 0 ; i < strlen(cuv) ; i++)
    {
        if (p->urm[cuv[i]-'a'] == NULL)
            return 0;
        p = p -> urm[cuv[i]-'a'];
    }
    return p -> cuvinte;
}
int prefix()
{
    int sol = 0;
    int i;
    trie *p=rad;
    for (i = 0 ; i < strlen(cuv) ; i++)
    {
        if (p->urm[cuv[i]-'a'] == NULL)
            return sol;
        p = p -> urm[cuv[i]-'a'];
        sol++;
    }
    return sol;
}
int main()
{
    int op;
    f.open("trie.in",ios::in);
    g.open("trie.out",ios::out);
    rad = new trie();
    while( f>>op>>cuv)
    {
        if (op == 0)
            adauga();
        else if (op == 1 )
            sterge();
        else if (op == 2 )
            g<<apariti()<<'\n';
        else if (op == 3 )
            g<<prefix()<<'\n';
    }

    return 0;
}