Cod sursa(job #2875411)

Utilizator levladiatorDragutoiu Vlad-Ioan levladiator Data 21 martie 2022 16:50:32
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.32 kb
#include <bits/stdc++.h>
#define pb push_back
#define pf push_front
#define ll long long
#define ull unsigned long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define EPSILON 0.000001

using namespace std;

const ll NMAX = 1e5 + 5, INF = 1e18, MOD = 666013, MMAX = 1e2 + 5, inf = INT_MAX;


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

struct Nod
{
    int nrCuv, nrAp;
    Nod *F[26];
    Nod()
    {
        nrCuv = nrAp = 0;
        for(int i = 0; i < 26; i++)
        {
            F[i] = NULL;
        }
    }
};

Nod *Trie;

void Add(char *s)
{
    Nod *crt = Trie;
    for(; *s != '\0'; s++)
    {
        int i = *s - 'a';
        if(crt->F[i] == NULL)
        {
            crt->F[i] = new Nod();
        }
        crt = crt->F[i];
        crt->nrAp++;
    }
    crt->nrCuv++;
}

int Count(char *s)
{
    Nod *crt = Trie;
    for(; *s != '\0'; s++)
    {
        int i = *s - 'a';
        if(crt->F[i] == NULL)
        {
            return 0;
        }
        crt = crt->F[i];
    }
    return crt->nrCuv;
}

int Lcp(char *s)
{
    int i, lg = 0;
    Nod *crt = Trie;
    for(; *s != '\0'; s++)
    {
        int i = *s - 'a';
        if(crt->F[i] == NULL)
        {
            return lg;
        }
        ++lg;
        crt = crt->F[i];
    }
    return lg;
}

void Delete(char *s)
{
    Nod *crt = Trie;
    Nod *ant;
    for(; *s != '\0'; s++)
    {
        int i = *s - 'a';
        ant = crt;
        crt = crt->F[i];
        crt->nrAp--;
        if(ant->nrAp == '\0')
        {
            delete ant;
        }
        else
        {
            if(crt->nrAp == '\0')
                ant->F[i] = NULL;
        }
    }
    crt->nrCuv--;
    if(crt->nrAp == 0)
    {
        delete crt;
    }
}

int main()
{
    cin.tie(0)->sync_with_stdio(0);
    cin.tie(NULL);
    cout.tie(NULL);
    int op;
    char w[21];
    Trie = new Nod();
    Trie->nrAp = 1;
    while(fin >> op >> w)
    {
        switch(op)
        {
        case 0:
            Add(w);
            break;
        case 1:
            Delete(w);
            break;
        case 2:
            fout << Count(w) << '\n';
            break;
        case 3:
            fout << Lcp(w) << '\n';
            break;
        }
    }
    return 0;
}