Cod sursa(job #2339766)

Utilizator mihailrazMihail Turcan mihailraz Data 9 februarie 2019 11:44:51
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.08 kb
#include <fstream>
#include <string.h>

using namespace std;
ifstream fi("trie.in");
ofstream fo("trie.out");
const int lmax=20;
int q;
char w[lmax+5];

struct nod_trie
{
    int nr_cuv, nr_fii;
    nod_trie* fii[26];
    nod_trie()
    {
        nr_cuv=0;
        nr_fii=0;
        memset(fii, 0, sizeof(fii));
    }
};

nod_trie* root=new nod_trie();

void add_word(nod_trie* nod, char* cuv)
{
    if(*cuv==NULL)
    {
        nod->nr_cuv++;
        return;
    }
    int delta=*cuv-'a';
    if(nod->fii[delta]==NULL)
    {
        nod->fii[delta]=new nod_trie();
        nod->nr_fii++;
    }
    add_word(nod->fii[delta], cuv+1);
}

int count_words(nod_trie* nod, char* cuv)
{
    if(*cuv==NULL)
    {
        return nod->nr_cuv;
    }
    int delta=*cuv-'a';
    if(nod->fii[delta]==NULL)
    {
        return 0;
    }
    count_words(nod->fii[delta], cuv+1);
}

int erase_word(nod_trie* nod, char* cuv)
{
    if(*cuv==NULL)
    {
        nod->nr_cuv--;
        if(nod->nr_cuv==0 && nod->nr_fii==0 && nod!=root)
        {
            delete nod;
            return 1; /// s-a sters un nod
        }
        return 0; /// nu s-a sters nodul
    }
    int delta=*cuv-'a';
    if(erase_word(nod->fii[delta], cuv+1))
    {
        nod->nr_fii--;
        nod->fii[delta]=0;
        if(nod->nr_cuv==0 && nod->nr_fii==0 && nod!=root)
        {
            delete nod;
            return 1;
        }
    }
    return 0;
}

int pref(nod_trie* nod, char* cuv)
{
    if(*cuv==0)
        return 0;
    int delta=*cuv-'a';
    if(nod->fii[delta]==0)
        return 0;
    return 1+pref(nod->fii[delta], cuv+1);
}

int main()
{
    while(fi>>q)
    {
        fi>>w;
        if(q==0)
        {
            add_word(root, w);
        }
        else if(q==1)
        {
            erase_word(root, w);
        }
        else if(q==2)
        {
            fo<<count_words(root, w)<<"\n";
        }
        else
        {
            fo<<pref(root, w)<<"\n";
        }
    }
    fi.close();
    fo.close();
    return 0;
}