Cod sursa(job #2679476)

Utilizator davidcotigacotiga david davidcotiga Data 30 noiembrie 2020 17:14:44
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>
#include <cstring>

#define CH (*s - 'a')

using namespace std;

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

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

Trie* T = new Trie;

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

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

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

int del(Trie* nod, char* s) {
	if (*s == '\n')
		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 que(Trie* nod, char* s) {
	if (*s == '\n')
		return nod->cnt;

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

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

int main() {
	char line[32];

	freopen("trie.in", "r", stdin);
	freopen("trie.out", "w", stdout);

	fgets(line, 32, stdin);

	while (!feof(stdin)) {
		switch (line[0]) {
		case '0': ins(T, line + 2); break;
		case '1': del(T, line + 2); break;
		case '2': printf("%d\n", que(T, line + 2)); break;
		case '3': printf("%d\n", pre(T, line + 2, 0)); break;
		}

		fgets(line, 32, stdin);
	}
	return 0;
}