Cod sursa(job #2892258)

Utilizator PalcPalcu Stefan Palc Data 21 aprilie 2022 14:25:27
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <bits/stdc++.h>
using namespace std;

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

struct Nod
{
    int fr, nrcuv;
    Nod *leg[26];
    Nod(int _fr, int _nrcuv)
    {
        fr = _fr;
        nrcuv = _nrcuv;
        for (int i = 0; i <= 25; i++)
            leg[i] == NULL;
    }
};
Nod *rad;

void Op0(string x)
{
    int c;
    Nod *p, *q;
    p = rad;
    for (unsigned int i = 0; i < x.length(); i++)
    {
        c = x[i] - 'a';
        if (p->leg[c] != NULL)
        {
            p = p->leg[c];
            p->nrcuv++;
        }
        else
        {
            q = new Nod(0, 1);
            p->leg[c] = q;
            p = p->leg[c];
        }
    }
    p->fr++;
}

void Op1(string x)
{
    int c;
    Nod *p;
    p = rad;
    for (unsigned int i = 0; i < x.length(); i++)
    {
        c = x[i] - 'a';
        p = p->leg[c];
        p->nrcuv--;
    }
    p->fr--;
}

int Op2(string x)
{
    int c;
    Nod *p;
    p = rad;
    for (unsigned int i = 0; i < x.length(); i++)
    {
        c = x[i] - 'a';
        if (p->leg[c] == NULL) return 0;
        p = p->leg[c];
    }
    return p->fr;
}

int Op3(string x)
{
    int c;
    int l = 0;
    Nod *p;
    p = rad;
    for (unsigned int i = 0; i < x.length(); i++)
    {
        c = x[i] - 'a';
        if (p->leg[c] == NULL) return l;
        p = p->leg[c];
        if (p->nrcuv == 0) return l;
        l++;
    }
    return l;
}

int main()
{
    int op;
    string a;
    rad = new Nod(0, 0);
    while (fin >> op >> a)
    {
        if (op == 0) Op0(a);
        else if (op == 1) Op1(a);
        else if (op == 2) fout << Op2(a) << "\n";
        else fout << Op3(a) << "\n";
    }
    fin.close();
    fout.close();
    return 0;
}