Cod sursa(job #3252027)

Utilizator adelina_15InfoAdelina Radoi adelina_15Info Data 28 octombrie 2024 11:09:52
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.85 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

struct Tnode{
    int cnt, nrfii;
    Tnode *v[26];
    Tnode()
    {
        cnt = 0;
        nrfii = 0;
        for(int i = 0; i < 26; i++)
            v[i] = NULL;
    }
};

Tnode *nod = new Tnode;

void add(Tnode *node, string s, int i)
{
    if(i == s.size())
    {
        node->cnt++;
        return;
    }
    if(node->v[s[i]-'a'] == NULL)
    {
        node->v[s[i]-'a'] = new Tnode;
        node->nrfii++;
    }
    add(node->v[s[i]-'a'], s, i+1);
}

bool del(Tnode *node, string s, int i)
{
    if(i == s.size())
    {
        node->cnt--;
        if(node->cnt == 0 && node->nrfii == 0 && node != nod)
        {
            delete node;
            return true;
        }
        return false;
    }
    if(del(node->v[s[i]-'a'], s, i+1))
    {
        node->nrfii--;
        node->v[s[i]-'a']=NULL;
    }
    if(node->cnt == 0 && node->nrfii == 0 && node != nod)
    {
        delete node;
        return true;
    }
    return false;
}

int nrap(Tnode *node, string s, int i)
{
    if(i == s.size())
        return node->cnt;
    if(node->v[s[i]-'a'] == NULL)
        return 0;
    return nrap(node->v[s[i]-'a'], s, i+1);
}

int lpref(Tnode *node, string s, int i)
{
    if(i == s.size())
        return i;
    if(node->v[s[i]-'a'] != NULL)
        return lpref(node->v[s[i]-'a'], s, i+1);
    return i;
}

int main()
{
    int op;
    string crt;
    while(fin >> op)
    {
        fin >> crt;
        if(op == 0)
            add(nod, crt, 0);
        else if(op == 1)
        {
            bool k = del(nod, crt, 0);
        }
        else if(op == 2)
            fout << nrap(nod, crt, 0) << "\n";
        else
            fout << lpref(nod, crt, 0) << "\n";
    }
    return 0;
}