Cod sursa(job #2844854)

Utilizator Iordache_CezarIordache Cezar Iordache_Cezar Data 5 februarie 2022 18:50:41
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.88 kb
#include <bits/stdc++.h>

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

struct nod
{
    int val;
    nod *chr[26];
    nod()
    {
        for (int i = 0; i < 26; i++)
            chr[i] = nullptr;
        val = 0;
    }
}*root;

int cerinta;
string s;

void citire();
void adaug();
int sterg(nod *crt, int i);
int aparitii();
int lungime();

int main()
{
    citire();
    int ok =1;
    return 0;
}

void citire()
{
    root = new nod;
    while (fin >> cerinta >> s)
    {
        if (cerinta == 0)
            adaug();
        else if (cerinta == 1)
            sterg(root, 0);
        else if (cerinta == 2)
            fout << aparitii() << '\n';
        else
            fout << lungime() << '\n';
    }
}

void adaug()
{
    nod *crt = root;
    for (int i = 0; i < s.size(); i++)
    {
        if (crt->chr[s[i]-'a'] == nullptr)
            crt->chr[s[i]-'a'] = new nod;
        crt = crt->chr[s[i]-'a'];
    }
    crt->val++;
}

int sterg(nod *crt, int i)
{
    if (s.size() == i)
        crt->val--;
    if (i != s.size())
    {
        if (sterg(crt->chr[s[i]-'a'], i+1))
        {
            crt->chr[s[i]-'a'] = nullptr;
            delete crt->chr[s[i]-'a'];
        }
    }

    int cnt = 0;
    for (int j = 0; j < 26; j++)
        if (crt->chr[j] == nullptr)
            cnt++;
    if (cnt == 26 && crt->val == 0)
        return 1;
    return 0;
}

int aparitii()
{
    nod *crt = root;
    for (int i = 0; i < s.size(); i++)
    {
        if (crt->chr[s[i]-'a'] == nullptr)
            return 0;
        crt = crt->chr[s[i]-'a'];
    }
    return crt->val;
}

int lungime()
{
    nod *crt = root;
    for (int i = 0; i < s.size(); i++)
    {
        if (crt->chr[s[i]-'a'] == nullptr)
            return i;
        crt = crt->chr[s[i]-'a'];
    }
    return s.size();
}