Cod sursa(job #2549528)

Utilizator Alin_StanciuStanciu Alin Alin_Stanciu Data 17 februarie 2020 19:21:07
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.27 kb
#include <iostream>
#include <fstream>

using namespace std;

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

struct Nod
{
    int cnt = 0;
    Nod* F[26];
};

Nod* r = new Nod();

void Add(char s[])
{
    Nod* nod = r;
    for (int i = 0; s[i] != '\0'; ++i)
    {
        if (nod->F[s[i] - 'a'] == nullptr)
            nod->F[s[i] - 'a'] = new Nod();
        nod = nod->F[s[i] - 'a'];
        ++nod->cnt;
    }
}

void Delete(char s[])
{
    Nod* nod = r;
    for (int i = 0; s[i] != '\0'; ++i)
    {
        --(nod->F[s[i] - 'a']->cnt);
        if (nod->F[s[i] - 'a']->cnt == 0)
        {
            Nod* ptr = nod->F[s[i] - 'a'];
            nod->F[s[i] - 'a'] = nullptr;
            break;

            Nod* ptr2;
            do
            {
                ptr2 = nullptr;
                for (int i = 0; i < 26; ++i)
                {
                    if (ptr->F[i] != nullptr)
                    {
                        ptr2 = ptr->F[i];
                        break;
                    }
                }
                delete ptr;
                ptr = ptr2;
            }
            while (ptr != nullptr);
        }
        nod = nod->F[s[i] - 'a'];
    }
}

int Count(char s[])
{
    Nod* nod = r;
    bool ok = true;
    for (int i = 0; s[i] != '\0'; ++i)
    {
        if (nod->F[s[i] - 'a'] == nullptr)
        {
            ok = false;
            break;
        }
        nod = nod->F[s[i] - 'a'];
    }

    if (!ok)
        return 0;
    int sum = 0;
    for (int i = 0; i < 26; ++i)
    {
        if (nod->F[i] != nullptr)
            sum += nod->F[i]->cnt;
    }
    return nod->cnt - sum;
}

int Max(char s[])
{
    int cnt = 0;
    Nod* nod = r;
    for (int i = 0; s[i] != '\0'; ++i)
    {
        if (nod->F[s[i] - 'a'] != nullptr)
        {
            ++cnt;
            nod = nod->F[s[i] - 'a'];
        }
        else break;
    }
    return cnt;
}

int main()
{
    int c;
    char s[21];
    while (fin >> c >> s)
    {
        if (c == 0)
            Add(s);
        else if (c == 1)
            Delete(s);
        else if (c == 2)
            fout << Count(s) << '\n';
        else if (c == 3)
            fout << Max(s) << '\n';
    }

    return 0;
}