Cod sursa(job #2582509)

Utilizator AlexandruGabrielAliciuc Alexandru AlexandruGabriel Data 16 martie 2020 20:31:59
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.07 kb
#include <bits/stdc++.h>

using namespace std;

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

int op, ans, m;
char cuv[25];
bool del = 0;

struct Trie
{
    int cnt, fii;
    Trie *fiu[26];

    Trie()
    {
        cnt = fii = 0;
        for (int i = 0; i < 26; i++)
            fiu[i] = 0;
    }
};

Trie *t = new Trie;

void Insert(int n, Trie *p)
{
    if (n == m)
        p -> cnt++;
    else
    {
        if (p -> fiu[cuv[n] - 'a'] == 0)
        {
            p -> fiu[cuv[n] - 'a'] = new Trie;
            p -> fii++;
        }

        Insert(n + 1, p -> fiu[cuv[n] - 'a']);
    }
}

void Delete(int n, Trie *p)
{
    if (n == m)
    {
        p -> cnt--;
        if (p -> cnt == 0 && p -> fii == 0)
            del = 1;
    }
    else
    {
        Delete(n + 1, p -> fiu[cuv[n] - 'a']);

        if (del == 1)
        {
            if (p -> fiu[cuv[n] - 'a'] -> cnt == 0 && p -> fiu[cuv[n] - 'a'] -> fii == 0)
            {
                p -> fii--;
                p -> fiu[cuv[n] - 'a'] = NULL;
                delete p -> fiu[cuv[n] - 'a'];
            }
            else
                del = 0;
        }
    }
}

void findAp(int n, Trie *p)
{
    if (n == m)
        ans = p -> cnt;
    else
    {
        if (p -> fiu[cuv[n] - 'a'] != 0)
            findAp(n + 1, p -> fiu[cuv[n] - 'a']);
    }
}

void findPref(int n, Trie *p)
{
    if (n == m)
        return;

    if (p -> fiu[cuv[n] - 'a'] != 0)
    {
        ans++;
        findPref(n + 1, p -> fiu[cuv[n] - 'a']);
    }
}

int main()
{
    while (fin >> op >> cuv)
    {
        m = strlen(cuv);
        if (op == 0)
            Insert(0, t);
        else if (op == 1)
        {
            del = 0;
            Delete(0, t);
        }
        else if (op == 2)
        {
            ans = 0;
            findAp(0, t);

            fout << ans << "\n";
        }
        else if (op == 3)
        {
            ans = 0;
            findPref(0, t);

            fout << ans << "\n";
        }
    }
    return 0;
}