Cod sursa(job #3252017)

Utilizator Ruxandra009Ruxandra Vasilescu Ruxandra009 Data 28 octombrie 2024 11:00:05
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <fstream>

using namespace std;

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

struct Tnode{
    int cnt, fii;
    Tnode *v[26];

    Tnode()
    {
        cnt = fii = 0;
        for(int i = 0; i < 26; i ++)
            v[i] = NULL;
    }
};

Tnode *rad = new Tnode;
int op;
string a;

void add(Tnode *nod, string s, int i)
{
    if(i == s.size()){
        nod -> cnt ++;
        return ;
    }

    int ind = s[i] - 'a';
    if(nod -> v[ind] == NULL)
        nod -> v[ind] = new Tnode, nod -> fii ++;

    add(nod -> v[ind], s, i + 1);
}

int del(Tnode *nod, string s, int i)
{
    if(i == s.size())
    {
        nod -> cnt --;
        if(nod -> cnt == 0 && nod -> fii == 0 && nod != rad){
            delete nod;
            return 1;
        }

        return 0;
    }

    int ind = s[i] - 'a';
    int ok = del(nod -> v[ind], s, i + 1);

    if(ok)
        nod -> fii --, nod -> v[ind] = NULL;

    if(nod -> cnt == 0 && nod -> fii == 0 && nod != rad)
    {
        delete nod;
        return 1;
    }

    return 0;
}

int apar(Tnode *nod, string s, int i)
{
    if(i == s.size())
        return nod -> cnt;

    int ind = s[i] - 'a';
    return apar(nod -> v[ind], s, i + 1);
}

int pref(Tnode *nod, string s, int i)
{
    if(i == s.size())
        return i;

    int ind = s[i] - 'a';
    if(nod -> v[ind] == NULL)
        return i;

    return pref(nod -> v[ind], s, i + 1);
}

int main()
{
    while(f >> op >> a)
    {
        if(op == 0)
            add(rad, a, 0);

        else if(op == 1)
            del(rad, a, 0);

        else if(op == 2)
            g << apar(rad, a, 0) << '\n';

        else
            g << pref(rad, a, 0) << '\n';
    }
    return 0;
}