Cod sursa(job #3252029)

Utilizator adelinapetreAdelina Petre adelinapetre Data 28 octombrie 2024 11:14:15
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.4 kb
#include <fstream>
using namespace std;

ifstream cin("trie.in");
ofstream cout("trie.out");

const int Lmax = 26;

struct TRIE
{
    struct Node
    {
        int cnt, nrf;
        Node* v[Lmax];
        Node()
        {
            cnt = nrf = 0;
            for(int i = 0; i < 26; i ++)
                v[i] = NULL;
        }
    };
    Node* root = new Node();

    void add_node(Node *nod, string s, int poz)
    {
        if(poz == s.size())
        {
            nod->cnt ++;
            return;
        }
        if(nod->v[s[poz] - 'a'] == NULL)
            nod->v[s[poz] - 'a'] = new Node(), nod->nrf ++;
        add_node(nod->v[s[poz] - 'a'], s, poz + 1);
    }

    bool delete_node(Node *nod, string s,  int poz)
    {
        if(poz == s.size())
        {
            nod->cnt --;
            if(nod->cnt == 0 && nod != root && nod->nrf == 0)
            {
                delete nod;
                return 1;
            }
            return 0;
        }
        bool sters = delete_node(nod->v[s[poz] - 'a'], s, poz + 1);
        if(sters)
        {
            nod->nrf --;
            nod->v[s[poz] - 'a'] = NULL;
        }
        if(nod->cnt == 0 && nod != root && nod->nrf == 0)
        {
            delete nod;
            return 1;
        }
        return 0;
    }

    void count_ap(Node *nod, string s, int poz)
    {
        if(poz == s.size())
        {
            cout << nod->cnt << '\n';
            return;
        }
        if(nod->v[s[poz] - 'a'] == NULL)
        {
            cout << 0 << '\n';
            return;
        }
        count_ap(nod->v[s[poz] - 'a'], s, poz + 1);
    }

    void longest_pref(Node *nod, string s, int poz)
    {
        if(poz == s.size())
        {
            cout << s.size()<< '\n';
            return;
        }
        if(nod->v[s[poz] - 'a'] == NULL || nod->nrf == 0)
        {
            cout << poz << '\n';
            return;
        }
        longest_pref(nod->v[s[poz] - 'a'], s, poz + 1);
    }
} trie;

int main()
{
    int tip;
    string s;
    while(cin >> tip >> s)
    {
        if(tip == 0)
            trie.add_node(trie.root, s, 0);
        else if (tip == 1)
            trie.delete_node(trie.root, s, 0);
        else if(tip == 2)
            trie.count_ap(trie.root, s, 0);
        else
            trie.longest_pref(trie.root, s, 0);
    }
    return 0;
}