Cod sursa(job #2402577)

Utilizator WebDesignbyTMGhiorghiu Ioan-Viorel WebDesignbyTM Data 10 aprilie 2019 20:15:26
Problema Trie Scor 55
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#define DM 21
#define DN 31
#include <fstream>
using namespace std;

ifstream fi ("trie.in");
ofstream fo ("trie.out");
char cuv[DM];
short int q;

struct trie {
	short int ending, nrSons;
	trie * sons[DN];

	trie() {
		ending = nrSons = 0;
		for (short int i = 0; i < DN; ++i)
			sons[i] = 0;
	}

	void display() {
		fo << "nrSons : " << nrSons << "  -  ending : " << ending << '\n';
	}
};

trie * root = new trie();

void addWord(char * c, trie * crt) {
	if (*c == '\0') {
		++(crt->ending);
		return;
	}

	++(crt->nrSons);
	short int idx = *c - 'a';

	if (crt->sons[idx] == 0)
		crt->sons[idx] = new trie();
	addWord(c + 1, crt->sons[idx]);
}

void deleteWord(char * c, trie * crt) {
	if (*c == '\0') {
		--(crt->ending);
		if (!(crt->ending) && !(crt->nrSons))
			delete crt;
		return;
	}

	short int idx = *c - 'a';

	deleteWord(c + 1, crt->sons[idx]);
	--(crt->nrSons);
	if (!(crt->ending) && !(crt->nrSons))
		delete crt;
}

short int findWord(char * c, trie * crt) {
	if (*c == '\0')
		return (crt->ending);

	short int idx = *c - 'a';

	if (crt->sons[idx] == 0)
		return 0;
	return findWord(c + 1, crt->sons[idx]);
}

short int maxPrefix(char * c, trie * crt) {
	if (*c == '\0')
		return 0;

	short int idx = *c - 'a';
	if (crt->sons[idx] == 0)
		return 0;

	return 1 + maxPrefix(c + 1, crt->sons[idx]);
}

void parcurge(trie * crt) {
	crt->display();
	for (short int i = 0; i < DN; ++i)
		if (crt->sons[i] != 0) {
			char aux = 'a';
			aux += i;
			fo << "entering " << aux << '\n';
			parcurge(crt->sons[i]);
		}
}

int main() {
	while (fi >> q) {
		fi >> cuv;
		switch (q) {//ba, jur ca nu-s gay, vreau numai sa vad cum merge switch
			case 0:
				addWord(cuv, root);
				break;
			case 1:
				// parcurge(root);
				deleteWord(cuv, root);
				break;
			case 2:
				fo << findWord(cuv, root) << '\n';
				break;
			case 3:
				fo << maxPrefix(cuv, root) << '\n';
				break;
			default: 
				fo << "ba ce pula mea";
		}
	}
	// parcurge(root);	
}