Cod sursa(job #2890001)

Utilizator TanasucaGeorgeAlexandruTanasucaGeorgeAlexandru TanasucaGeorgeAlexandru Data 14 aprilie 2022 08:36:46
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <bits/stdc++.h>
using namespace std;

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

void Op0(string w)
{
    int j;
    Nod *p, *q;
    p = rad;
    for (unsigned int i = 0; i < w.length(); i++)
    {
        j = w[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 Op1(string w)
{
    int j;
    Nod *p;
    p = rad;
    for (unsigned int i = 0; i < w.length(); i++)
    {
        j = w[i] - 'a';
        p = p->leg[j];
        p->nrcuv--;

    }
    p->fr--;
}

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

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

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

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