Cod sursa(job #2679472)

Utilizator davidcotigacotiga david davidcotiga Data 30 noiembrie 2020 17:12:24
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>

#define CH (*s - 'a')

using namespace std;

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

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];

	while (fin >> line) {
		if (line[0] == '0')
			ins(T, line + 2);
		if (line[0] == '1')
			del(T, line + 2);
		if (line[0] == '2')
			fout << que(T, line + 2) << "\n";
		if (line[0] == '3')
			fout << pre(T, line + 2, 0) << "\n";
	}


	return 0;
}