Cod sursa(job #2339769)

Utilizator TavinciStefanescu Octavian Tavinci Data 9 februarie 2019 11:45:57
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.93 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

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==0)
    {
        nod->nr_cuv++;
        return;
    }
    short delta=*cuv-'a';
    if(nod->fii[delta]==0)
    {
        nod->fii[delta]=new nod_trie();
        nod->nr_fii++;
    }
    add_word(nod->fii[delta],cuv+1);
}

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

bool delete_word(nod_trie* nod, char* cuv)
{
    if(*cuv==0)
    {
        nod->nr_cuv--;
        if(nod->nr_cuv==0 && nod->nr_fii==0 && nod!=root)
        {
            delete nod;
            return 1;
        }
        return 0;
    }
    short delta=*cuv-'a';
    if(delete_word(nod->fii[delta],cuv+1)==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 prefix_length(nod_trie* nod, char* cuv)
{
    short delta=*cuv-'a';
    if(*cuv==0 || nod->fii[delta]==0)
        return 0;
    else
        return 1+prefix_length(nod->fii[delta],cuv+1);
}

short op;
char cuv[21];

int main()
{
    while(fin>>op)
    {
        fin>>cuv;
        if(op==0)
                add_word(root,cuv);
        else if(op==1)
                delete_word(root,cuv);
        else if(op==2)
                fout<<search_word(root,cuv)<<'\n';
        else
                fout<<prefix_length(root,cuv)<<'\n';
    }
    return 0;
}