Cod sursa(job #2549509)

Utilizator Alin_StanciuStanciu Alin Alin_Stanciu Data 17 februarie 2020 19:10:44
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 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->F[s[i] - 'a'] = nullptr;
            break;
        }
        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;
}