Cod sursa(job #2613870)

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

using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int x;
string cuv;

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

    Trie()
    {
        nrfii = cnt = 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(nod -> fiu[s[0] - 'a'] == 0 || s == "")
        return k;
    return pre(nod -> fiu[s[0] - 'a'], s.substr(1), k + 1);
}

int main()
{
    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';
                break;
        }
    }
    return 0;
}