Cod sursa(job #2721809)

Utilizator Y.MalmsteenB.P.M. Y.Malmsteen Data 12 martie 2021 11:56:39
Problema Trie Scor 35
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <fstream>
#include <vector>
//#include <array>

using namespace std;

struct Trie
{

    int nrCuv; ///Numărul de cuvinte care se termină în nodul curent
    int nrFii;
    unsigned char v[26];

    Trie()
    {
        nrFii = 0;
        nrCuv = 0;
        for(int i = 0; i < 26; ++i)
            v[i] = 0;
    }
};

vector <Trie> arb;

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

void Add(char *s)
{
    int nod = 0, k;
    for(int i = 0; s[i] != 0; ++i)
    {
        k = s[i] - 'a';
        if(arb[nod].v[k] == 0)
        {
            arb.push_back(Trie());
            arb[nod].v[k] = arb.size() - 1;
        }
        nod = arb[nod].v[k];
        arb[nod].nrFii++;
    }
    arb[nod].nrCuv++;
}

void Delete(char *s)
{
    int nod = 0;
    for(int i = 0; s[i] != 0; ++i)
    {
        nod = arb[nod].v[s[i] - 'a'];
        arb[nod].nrFii--;
    }
    arb[nod].nrCuv--;
}

int Count(char *s)
{
    int nod = 0;
    for(int i = 0; s[i] != 0; ++i)
    {
        nod = arb[nod].v[s[i] - 'a'];
        if(arb[nod].nrFii == 0)
            return 0;
    }
    return arb[nod].nrCuv;
}

int Lcp(char *s)
{
    int nod = 0, i;
    for(i = 0; s[i] != 0; ++i)
    {
        nod = arb[nod].v[s[i] - 'a'];
        if(arb[nod].nrFii == 0)
            return i;
    }
    return i;
}

int main()
{
    int op;
    char w[21];
    arb.push_back(Trie());
    while(f >> op >> w)
    {
        switch(op)
        {
        case 0:
            Add(w);
            break;
        case 1:
            Delete(w);
            break;
        case 2:
            g << Count(w) << '\n';
            break;
        case 3:
            g << Lcp(w) << '\n';
            //break;
        }
    }
    return 0;
}