Cod sursa(job #2613792)

Utilizator victorzarzuZarzu Victor victorzarzu Data 10 mai 2020 17:46:36
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");

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

    Trie()
    {
        cnt = nrfii = 0;
        memset(fiu, 0, sizeof(fiu));
    }
};

Trie *T = new Trie;

void ins(Trie *nod, string s)
{
    if(s == "")
    {
        nod -> cnt++;
        return;
    }
    if(nod -> fiu[s[0] - 'a'] == 0)
    {
        nod -> fiu[s[0] - 'a'] = new Trie();
        nod -> nrfii++;
    }
    ins(nod -> fiu[s[0] - 'a'], s.substr(1));
}

int del(Trie *nod, string s)
{
    if(s == "")
        nod -> cnt--;
    else if(del(nod -> fiu[s[0] - 'a'], s.substr(1)))
    {
        nod -> fiu[s[0] - 'a'] = 0;
        nod -> nrfii--;
    }
    if(nod -> cnt == 0 && nod -> nrfii == 0 && nod != T)
    {
        delete nod;
        return 1;
    }
    return 0;
}

int que(Trie *nod, string s)
{
    if(s == "")
        return nod -> cnt;
    if(nod -> fiu[s[0] - 'a'])
        return que(nod -> fiu[s[0] - 'a'], s.substr(1));
    return 0;
}

int pre(Trie *nod, string s, int k)
{
    if(s == "" || nod -> fiu[s[0] - 'a'] == 0)
        return k;
    return pre(nod -> fiu[s[0] - 'a'], s.substr(1), k + 1);
}

void Solve()
{
    int x;
    string cuv;
    while(f>>x>>cuv)
        {
            switch(x)
            {
                case 0:
                    ins(T, cuv);
                    break;
                case 1:
                    del(T, cuv);
                    break;
                case 2:
                    g<<que(T, cuv)<<'\n';
                    break;
                case 3:
                    g<<pre(T, cuv, 0)<<'\n';
            }
        }
}

int main()
{
    Solve();
    return 0;
}