Cod sursa(job #1166914)

Utilizator harababurelPuscas Sergiu harababurel Data 3 aprilie 2014 23:03:23
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <fstream>
#include <cstring>
#define sigma 26
#define child nd->son[s[p]-'a']
using namespace std;

int op;
string s;

struct Trie {
	int words, family;
	Trie *son[sigma];
	Trie() {
		words = family = 0;
		memset(son, 0, sizeof(son));
	}
} *T = new Trie;

void add(Trie *nd, int p) {
	if(p == s.size()) {
		nd->words++;
		return;
	}

	if(child == NULL) {
		nd->family++;
		child = new Trie;
	}
	add(child, p+1);
}

bool discard(Trie *nd, int p) {
	if(p == s.size()) nd->words--;
	else {
		if(discard(child, p+1)) {
			child = NULL;
			nd->family--;
		}
	}

	if(nd->words == 0 && nd->family == 0 && nd != T) {
		delete nd;
		return true;
	}
	return false;
}

int frequency(Trie *nd, int p) {
	if(p == s.size()) return nd->words;
	if(child == NULL) return 0;
	return frequency(child, p+1);
}

int prefixes(Trie *nd, int p) {	return (p == s.size() || child == NULL? p : prefixes(child, p+1)); }

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

	while(!f.eof()) {
		f>>op>>s;
		if(f.eof()) break;

		if(op == 0) add(T, 0);
		if(op == 1) discard(T, 0);
		if(op == 2) g<<frequency(T, 0)<<"\n";
		if(op == 3) g<<prefixes(T, 0)<<"\n";
	}

	return 0;
}