Cod sursa(job #1474567)

Utilizator theprdvtheprdv theprdv Data 22 august 2015 12:42:47
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#define _CRT_SECURE_NO_DEPRECATE
#include <cstdio>
#include <cstring>
#define CH (*s - 'a')

using namespace std;

struct Trie{
	int cnt, sons;
	Trie *son[26];

	Trie(){
		cnt = sons = 0;
		memset(son, 0, sizeof(son));
	}
};
Trie *T = new Trie;

void insert(Trie *&node, char *s){
	if (*s == '\n'){
		++node->cnt;
		return;
	}
	if (!node->son[CH]) node->son[CH] = new Trie, ++node->sons;
	insert(node->son[CH], s + 1);
}

bool del(Trie *&node, char *s){
	if (*s == '\n')
		--node->cnt;
	else if (del(node->son[CH], s + 1)){ // the son node was deleted
		--node->sons;
		node->son[CH] = 0;
	}

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

int query(Trie *&node, char *s){
	if (*s == '\n') return node->cnt;
	if (node->son[CH]) return query(node->son[CH], s + 1);
	return 0;
}

int prefix(Trie *&node, char *s, int k){
	if (*s == '\n' || !node->son[CH]) return k;
	return prefix(node->son[CH], s + 1, k + 1);
}

int main() {
	freopen("trie.in", "r", stdin);
	freopen("trie.out", "w", stdout);
	char line[25];

	fgets(line, 25, stdin);
	while (line[0]){
		switch (line[0]){
		case '0': insert(T, line + 2); break;
		case '1': del(T, line + 2); break;
		case '2': printf("%d\n", query(T, line + 2)); break;
		case '3': printf("%d\n", prefix(T, line + 2, 0)); break;
		}
		line[0] = 0;
		fgets(line, 25, stdin);
	}
	
	return 0;
}