Cod sursa(job #2844788)

Utilizator mihaicrisanMihai Crisan mihaicrisan Data 5 februarie 2022 14:14:55
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.92 kb
#include <fstream>
#include <cstring>

#define CH (*s - 'a')

using namespace std;

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

const int LEN = 26;

struct Trie {
	int cnt, nrfii;
	Trie *fiu[LEN];

	Trie() {
		cnt = nrfii = 0;
		memset(fiu, 0, sizeof(fiu));
	}
};

Trie *t = new Trie;

void close();
void Solve();
void add(Trie *t, char *s);
int del(Trie *t, char *s);
int get_occ(Trie *t, char *s);
int aparitii(Trie *t, char *s, int k);

int main() {
    Solve();
    close();
    return 0;
}

void Solve() {
    int x;
    char s[20];

    while (fin >> x >> s) {
        switch (x) {
            case 0:
                add(t, s);
                break;
            case 1:
                del(t, s);
                break;
            case 2:
                fout << get_occ(t, s) << '\n';
                break;
            case 3:
                fout << aparitii(t, s, 0) << '\n';
                break;

            default:
                break;
        }
    }
}

void add(Trie *nod, char *s) {
    if (*s == '\0') {
        nod->cnt ++;
        return;
    }

    if (nod->fiu[CH] == 0) {
        nod->fiu[CH] = new Trie;
        nod->nrfii ++;
    }

    add(nod->fiu[CH], s+1);
}

int del(Trie *nod, char *s) {
    if (*s == '\0')
        nod->cnt --;
    else if (del(nod->fiu[CH], s+1)) {
        nod->fiu[CH] = 0;
        nod->nrfii --;
    }

    if (nod->cnt == 0 && nod->nrfii == 0 && nod != t) {
        delete nod;
        return 1;
    }
    return 0;

}

int get_occ(Trie *nod, char *s) {
    if (*s == '\0')
        return nod->cnt;

    if (nod->fiu[CH])
        return get_occ(nod->fiu[CH], s+1);

    return 0;
}

int aparitii(Trie *nod, char *s, int k) {
    if (*s == '\0' || nod->fiu[CH] == 0)
        return k;

    return aparitii(nod->fiu[CH], s+1, k+1);
}

void close() {
    fin.close();
    fout.close();
}