Cod sursa(job #3005004)

Utilizator tomaionutIDorando tomaionut Data 16 martie 2023 18:47:00
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 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 Add(string s)
{
    int i, j;
    Nod *p, * q;
    p = rad;
    for (i = 0; s[i]; i++)
    {
        j = s[i] - 'a';
        if (p->leg[j] != NULL)
        {
            p = p->leg[j];
            p->nrcuv++;
        }
        else
        {
            q = new Nod(0, 1);
            p->leg[j] = q;
            p = q;
        }
    }
    p->fr++;
    
}

void Delete(string s)
{
    int i, j;
    Nod* p = rad;
    for (i = 0; s[i]; i++)
    {
        j = s[i] - 'a';
        p = p->leg[j];
        p->nrcuv--;
    }
    p->fr--;
}

int NrAp(string s)
{
    int i, j;
    Nod* p = rad;
    for (i = 0; s[i]; i++)
    {
        j = s[i] - 'a';
        if (p->leg[j] == NULL) return 0;
        p = p->leg[j];
    }
    return p->fr;
}

int Len(string s)
{
    int i, j;
    Nod* p = rad;
    for (i = 0; s[i]; i++)
    {
        j = s[i] - 'a';
        if (p->leg[j] == NULL) return i;
        p = p->leg[j];
        if (p->nrcuv == 0) return i;
    }
    return s.size();
}

int main()
{
    int op;
    string s;
    rad = new Nod(0, 0);
    while (fin >> op >> s)
    {
        if (op == 0)
            Add(s);
        else if (op == 1)
            Delete(s);
        else if (op == 2)
            fout << NrAp(s) << "\n";
        else
            fout << Len(s) << "\n";
    }

    return 0;
}