Cod sursa(job #3148252)

Utilizator andystarzSuna Andrei andystarz Data 30 august 2023 11:30:54
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.52 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
struct Trie
{
    int numFii;
    int ultLit;
    int numCuv;
    Trie* tata;
    Trie* fii[26];
    Trie()
    {
        numFii=0;
        numCuv=0;
        ultLit=0;
        memset(fii, 0, sizeof(fii));
        tata=NULL;
    }
};
Trie* root = new Trie;
string s;
int main()
{
    ifstream cin ("trie.in");
    ofstream cout ("trie.out");
    int cer;
    while (cin>>cer>>s>>ws)
    {
        if (cer==0)
        {
            Trie* nod=root;
            for (int i=0; i<s.size(); i++)
            {
                if (nod->fii[s[i]-'a']==NULL)
                {
                    nod->numFii++;
                    nod->fii[s[i]-'a']=new Trie;
                    nod->fii[s[i]-'a']->tata=nod;
                    nod->fii[s[i]-'a']->ultLit=(s[i]-'a');
                }
                nod=nod->fii[s[i]-'a'];
            }
            nod->numCuv++;
        }
        else if (cer==1)
        {
            Trie* nod = root;
            for (int i=0; i<s.size(); i++)
            {
                nod=nod->fii[s[i]-'a'];
            }
            nod->numCuv--; ///aaa trebuie sa sterg aparitia
            while (nod != root) ///so quirky, pentru ca astea sunt pointers atunci devin egale doar cand ocupa aceeasi pozitie din memorie
            {
                Trie* urm = nod->tata;
                int lit = nod -> ultLit;
                if (nod->numFii==0 && nod->numCuv==0)
                {
                    delete(nod);
                    urm->numFii--;
                    urm->fii[lit]=NULL;
                }
                nod = urm;
            }
        }
        else if (cer==2)
        {
            Trie* nod = root;
            for (int i=0; i<s.size(); i++)
            {
                if (nod->fii[s[i]-'a']==NULL)
                {
                    cout<<0<<'\n';
                    break;
                }
                nod = nod->fii[s[i]-'a'];
                if(i==s.size()-1)
                cout<<nod->numCuv<<'\n';
            }

        }
        else if (cer==3)
        {
            Trie* nod = root;
            for (int i=0; i<s.size(); i++)
            {
                if (nod->fii[s[i]-'a']==NULL)
                {
                    cout<<i<<'\n';
                    break;
                }
                nod=nod->fii[s[i]-'a'];
                if (i==s.size()-1)
                cout<<i+1<<'\n';
            }
        }
    }
}