Cod sursa(job #1223856)

Utilizator harababurelPuscas Sergiu harababurel Data 29 august 2014 00:19:19
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 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;
}