Cod sursa(job #2582490)

Utilizator AlexandruGabrielAliciuc Alexandru AlexandruGabriel Data 16 martie 2020 20:13:02
Problema Trie Scor 35
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.02 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)
        {
            del = 1;
            delete p;
        }
    }
    else
    {
        Delete(n + 1, p -> fiu[cuv[n] - 'a']);

        if (del == 1)
            p -> fiu[cuv[n] - 'a'] = NULL;

        if (del == 1 && p -> fii <= 1 && p != t)
            delete p;
        else
        {
            if (del == 1)
            {
                del = 0;
                p -> fii--;
            }
        }
    }
}

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 (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;
}