Cod sursa(job #3005585)

Utilizator rARES_4Popa Rares rARES_4 Data 17 martie 2023 09:05:17
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.9 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream f ("trie.in");
ofstream g ("trie.out");
struct nod{
int cuvinte,prefixe;
nod *copii[30];

nod()
{
    cuvinte = 0;
    prefixe = 0;
    for(int i = 0;i<30;i++)
        copii[i] =0 ;
}
}*rad;
void adaugare(nod *curent,int indice,int l,char *cuv)
{
    curent->prefixe++;
    if(indice==l)
    {
        curent->cuvinte++;
        return;
    }
    if(curent->copii[cuv[indice]-'a']==NULL)
    {
        curent->copii[cuv[indice]-'a'] = new nod;
    }
    adaugare(curent->copii[cuv[indice]-'a'],indice+1,l,cuv);

}
void stergere(nod *curent,int indice,int l,char *cuv)
{
    curent->prefixe--;
    if(indice==l)
    {
        curent->cuvinte--;
        return;
    }
    stergere(curent->copii[cuv[indice]-'a'],indice+1,l,cuv);
}
int numarare(nod *curent,int indice,int l,char *cuv)
{
    if(indice==l)
    {
        return  curent->cuvinte;

    }

    if(curent->copii[cuv[indice]-'a']== 0 || curent->copii[cuv[indice]-'a']->prefixe== 0)
        return 0;
    return numarare(curent->copii[cuv[indice]-'a'],indice+1,l,cuv);
}
int prefix(nod *curent ,int indice,int l,char *cuv)
{
    if(indice==l)
        return l;
    if(curent->copii[cuv[indice]-'a']== 0 || curent->copii[cuv[indice]-'a']->prefixe== 0)
        return indice;
    return prefix(curent->copii[cuv[indice]-'a'],indice+1,l,cuv);
}
int main()
{
    int c;
    nod *rad = new nod;
    char cuv[30];
    while(f >> c>>cuv)
    {
        if(c==0)
            adaugare(rad,0,strlen(cuv),cuv);
        else
            if(c==1)
                stergere(rad,0,strlen(cuv),cuv);
            else
                if(c==2)
                    g << numarare(rad,0,strlen(cuv),cuv)<< '\n';
                else
                    if(c==3)
                        g << prefix(rad,0,strlen(cuv),cuv)<< '\n';
    }
}