Cod sursa(job #1458494)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 7 iulie 2015 17:28:53
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <stdio.h>
#include <string.h>
#define poz (*s - 'a')
using namespace std;

typedef struct Trie{
	int nrfii, cnt;
	Trie *fiu[26];

	Trie(){
		nrfii = cnt = 0;
		memset(fiu, 0, sizeof(fiu));
	}
} Trie;

Trie *T = new Trie;

void pushTrie(Trie* node, char* s);
int popTrie(Trie* node, char* s);
int number(Trie* node, char* s);
int prefix(Trie* node, char* s);

int main(){
	freopen("trie.in", "r", stdin);
	freopen("trie.out", "w", stdout);
	char s[25];
	while(fgets(s, 25, stdin))
		switch(s[0]){
			case '0': pushTrie(T, s + 2); break;
			case '1': popTrie(T, s + 2); break;
			case '2': printf("%d\n", number(T, s + 2)); break;
			default: printf("%d\n", prefix(T, s + 2));
		}
	return 0;
}

void pushTrie(Trie* node, char* s){
	if(*s == '\n'){
		node->cnt++;
		return;
	}

	if(!node->fiu[poz]){
		node->fiu[poz] = new Trie;
		node->nrfii++;
	}
	pushTrie(node->fiu[poz], s + 1);
}

int popTrie(Trie* node, char* s){
	if(*s == '\n')
		node->cnt--;
	else if(popTrie(node->fiu[poz], s + 1)){
		node->fiu[poz] = NULL;
		node->nrfii--;
	}

	if(node->cnt == 0 && node->nrfii == 0 && node != T){
		delete node;
		return 1;
	}
	return 0;
}

int number(Trie* node, char* s){
	if(*s == '\n')
		return node->cnt;

	if(node->fiu[poz])
		return number(node->fiu[poz], s + 1);
	return 0;
}

int prefix(Trie* node, char* s){
	if(*s == '\n')
		return 0;

	if(!node->fiu[poz])
		return 0;

	return prefix(node->fiu[poz], s + 1) + 1;
}