Cod sursa(job #2762111)

Utilizator Razvan86Razvan Gabriel Razvan86 Data 5 iulie 2021 16:12:12
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.61 kb
#include <bits/stdc++.h>

using namespace std;

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

struct nod_arbore
{
    nod_arbore *litere[26];
    nod_arbore *tata;
    int nr_fii;
    int nr_aparitii_cuvant;
};

void initializare_nod_arbore_nou (nod_arbore *oarecare)
{
    for (int i=0; i<26; i++)
        oarecare->litere[i] = NULL;
    oarecare->tata = NULL;
    oarecare->nr_fii = 0;
    oarecare->nr_aparitii_cuvant = 0;
}

int main()
{
    int x; char cuvant[30];
    nod_arbore *R = new nod_arbore;
    initializare_nod_arbore_nou(R);
    while (fin >> x >> cuvant)
    {
        nod_arbore *curent = R;
        if (x==0)
        {
            int lungime_cuvant = strlen(cuvant);
            for (int i=0; i<lungime_cuvant; i++)
            {
                int corespondent_litera = int(cuvant[i])-97;
                if (curent->litere[corespondent_litera]==NULL)
                {
                    curent->litere[corespondent_litera] = new nod_arbore;
                    (curent->nr_fii)++;
                    initializare_nod_arbore_nou(curent->litere[corespondent_litera]);
                    (curent->litere[corespondent_litera])->tata = curent;
                    curent = curent->litere[corespondent_litera];
                }
                else
                    curent = curent->litere[corespondent_litera];
            }
            (curent->nr_aparitii_cuvant)++;
        }
        else if (x==1)
        {
            int lungime_cuvant = strlen(cuvant);
            for (int i=0; i<lungime_cuvant; i++)
            {
                int corespondent_litera = int(cuvant[i])-97;
                curent = curent->litere[corespondent_litera];
                if (curent==NULL)
                    break;
            }
            if (curent==NULL)
                    break;
            if (curent->nr_aparitii_cuvant>1)
                (curent->nr_aparitii_cuvant)--;
            else if (curent->nr_aparitii_cuvant==1)
            {
                int j = strlen(cuvant)-1;
                (curent->nr_aparitii_cuvant)--;
                while (curent->nr_aparitii_cuvant==0 && curent->nr_fii==0 && curent->tata!=NULL)
                {
                    int corespondent_litera = int(cuvant[j])-97;
                    nod_arbore *auxiliar = curent;
                    curent = curent->tata;
                    (curent->nr_fii)--;
                    curent->litere[corespondent_litera] = NULL;
                    delete auxiliar;
                    j--;
                }
            }
        }
        else if (x==2)
        {
            int lungime_cuvant = strlen(cuvant);
            for (int i=0; i<lungime_cuvant; i++)
            {
                int corespondent_litera = int(cuvant[i])-97;
                curent = curent->litere[corespondent_litera];
                if (curent==NULL)
                {
                    fout << 0 << '\n';
                    break;
                }
            }
            if (curent!=NULL)
                fout << curent->nr_aparitii_cuvant << '\n';
        }
        else
        {
            int lungime_cuvant = strlen(cuvant);
            for (int i=0; i<lungime_cuvant; i++)
            {
                int corespondent_litera = int(cuvant[i])-97;
                curent = curent->litere[corespondent_litera];
                if (curent==NULL)
                {
                    fout << i << '\n';
                    break;
                }
            }
            if (curent!=NULL)
                fout << lungime_cuvant << '\n';
        }
    }
    return 0;
}