Cod sursa(job #2920304)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 23 august 2022 16:06:23
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.98 kb
#include <bits/stdc++.h>
#include <sys/time.h>
/// TONI BO$$ was here
/// #MLC

using namespace std;
struct Node
{
    int val = 0;
    int nrfii = 0;
    Node * _goto[26];
    Node ()
    {
        memset(_goto, 0, sizeof(_goto));
    }
};

Node * root = new Node;
string s;
int nn;

void _insert(string &s)
{
    Node * curstate = root;
    for(auto it : s)
        if(curstate->_goto[it - 'a'] == 0)
            curstate->nrfii++, curstate = curstate->_goto[it - 'a'] = new Node;
        else
            curstate = curstate->_goto[it - 'a'];
    curstate->val++;
}

int _delete(int i, Node * curstate, string &s)
{
    if(i == nn)
        curstate->val--;
    else
        if(_delete(i + 1, curstate->_goto[s[i] - 'a'], s))
            curstate->nrfii--, curstate->_goto[s[i] - 'a'] = 0;
    if(curstate->val == 0 && curstate->nrfii == 0 && curstate != root)
    {
        delete curstate;
        return 1;
    }
    return 0;
}

int _occurences(string &s)
{
    Node * curstate = root;
    for(int i = 0; i < nn && curstate != 0; i++)
        curstate = curstate->_goto[s[i] - 'a'];
    if(!curstate)
        return 0;
    return curstate->val;
}

int _prefix(string &s)
{
    Node * curstate = root;
    int i;
    for(i = 0; i < nn; i++)
    {
        curstate = curstate->_goto[s[i] - 'a'];
        if(curstate == 0)
            break;
    }
    return i;
}

int main()
{
    int q;
	ios_base::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    struct timeval start, stop;
    while(cin >> q)
    {
        getline(cin, s);
        s = s.substr(1);
        nn = s.size();
        switch(q)
        {
            case 0:  _insert(s); break;
            case 1:  _delete(0, root, s); break;
            case 2:  cout << _occurences(s) << "\n"; break;
            case 3:  cout << _prefix(s) << "\n"; break;
        }
    }

    return 0;
}