Cod sursa(job #1335872)

Utilizator ooptNemes Alin oopt Data 5 februarie 2015 23:55:41
Problema Trie Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
// trie
#include <fstream>
#include <cmath>
#include <vector>
#include <string>
using namespace std;

struct trie {
	int cnt;
	int fii;
	trie *son[26];
	trie() {
		cnt = fii = 0;
		for (int i=0;i<26;i++)
			son[i] = NULL;
	}
	~trie() {
		for (int i=0;i<26;i++)
			delete son[i];
	}
};

ifstream f("trie.in");
ofstream g("trie.out");

trie *root;
string in;

void addOnTrie(int index, trie *node) {
	if (index == in.size()) {
		node->cnt++;
		return;
	}
	if (node->son[in[index]-'a'] == NULL) {
		node->son[in[index]-'a'] = new trie();
		node->fii++;
	}
	addOnTrie(index+1, node->son[in[index]-'a']);
}

int queryTrie(int index, trie *node) {
	if (index == in.size())
		return node->cnt;
	if (node->son[in[index]-'a'] != NULL)
		return queryTrie(index+1, node->son[in[index]-'a']);
	return 0;
}

int lenTrie(int index, trie *node) {
	if (index == in.size())
		return 0;
	if (node->son[in[index]-'a'] == NULL)
		return 0;
	return 1+lenTrie(index+1, node->son[in[index]-'a']);
}

bool deleteOnTrie(int index, trie *node) {
	bool sonDeleted;
	if (index == in.size()) {
		node->cnt--;
	}else if (deleteOnTrie(index+1, node->son[in[index]-'a'])) {
		node->son[in[index]-'a'] = NULL;
		node->fii--;
	}

	if (node != root && node->fii == 0 && node->cnt == 0) {
		delete node;
		return true;
	}
	return false;
}

void read() {
	root = new trie();
	
	int type;
	while (f >> type) {
		f>>in;
		if (type == 0) {
			addOnTrie(0, root);
		} else if (type == 1) {
			deleteOnTrie(0, root);
		} else if (type == 2) {
			g<<queryTrie(0, root)<<endl;
		} else if (type == 3) {
			g<<lenTrie(0, root)<<endl;
		}
	}
}

int main() {
	
	read();

	f.close(); g.close();
	return 0;
}