Cod sursa(job #2402669)

Utilizator WebDesignbyTMGhiorghiu Ioan-Viorel WebDesignbyTM Data 10 aprilie 2019 21:48:24
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#define DM 21
#define DN 27
#include <fstream>
using namespace std;

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

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

	trie() {
		ending = nrSons = 0;
		for (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;
	}

	int idx = *c - 'a';

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

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

	int idx = *c - 'a';

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

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

	int idx = *c - 'a';

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

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

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

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

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:
				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";
		}
	}
	return 0;
}