Cod sursa(job #2222553)

Utilizator ContDeRacistAliniateEBlat ContDeRacist Data 17 iulie 2018 11:55:51
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream cin("trie.in");
ofstream cout("trie.out");

typedef struct Nod * Pointer;

struct Nod {
    int frec = 0;
    vector < Pointer > adia;

    Nod () {
        adia = vector < Pointer > ('z' - 'a' + 1, 0);
    }

};

void adauga (Pointer k, string x, int s_b) {
    for (int i = 0; i < x.size(); ++i) {

        char lit = x[i] - 'a';

        if (k->adia[lit] == 0) {
            k->adia[lit] = new Nod();
        }

        k = k->adia[lit];
        k->frec += s_b;
    }
}

int nrap(Pointer k, string x) {

    for (int i = 0; i < x.size(); ++i) {

        char lit = x[i] - 'a';

        if (k->adia[lit] == 0) {
            return 0;
        }

        k = k->adia[lit];

    }

    int g(k->frec);

    for (int i = 0; i <= 'z' - 'a'; ++i) {
        if (k->adia[i] != 0) {
            g -= k->adia[i]->frec;
        }
    }

    return g;

}

int maxpref(Pointer k, string x) {

    for (int i = 0; i < x.size(); ++i) {

        char lit = x[i] - 'a';

        if (k->adia[lit] == 0) {
            return i;
        }

        if (k->adia[lit]->frec == 0) {
            return i;
        }

        k = k->adia[lit];

    }

    return x.size();

}

string s;

int main()
{

    Pointer k = new Nod();

    int cond;

    while (cin >> cond) {
        cin >> s;

        if (cond == 0) {
            adauga(k, s, 1);
        }

        if (cond == 1) {
            adauga(k, s, -1);
        }

        if (cond == 2) {
            cout << nrap(k, s) << '\n';
        }

        if (cond == 3) {
            cout << maxpref(k, s) << '\n';
        }
    }

    return 0;
}