Cod sursa(job #2339798)

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

using namespace std;

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

struct nod_trie
{
    int nr_cuv;
    char nr_fii;
    nod_trie* fii[26];
    nod_trie()
    {
        nr_cuv=0;
        nr_fii=0;
        memset(fii,0,sizeof(fii));
    }
};
short op;
char cuv[21];
nod_trie* root = new nod_trie();
void add_word(nod_trie* nod, char* cuv)
{
    if(*cuv==0)
    {
        nod->nr_cuv++;
        return;
    }
    char 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;
    char 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;
    }
    char 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)
{
    char delta=*cuv-'a';
    if(*cuv==0 || nod->fii[delta]==0)
        return 0;
    else
        return 1+prefix_length(nod->fii[delta],cuv+1);
}
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;
}