Cod sursa(job #1335887)

Utilizator ooptNemes Alin oopt Data 6 februarie 2015 00:12:41
Problema Trie Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
// trie
#include <fstream>
#include <cmath>
#include <cstring>
#include <vector>
#define ch(a) (int)((a)-'a')
using namespace std;

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

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

trie *root;
char in[50];
int len;

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

int queryTrie(int index, trie *node) {
    if (index == len) {
        return node->cnt;
    }
    if (node->son[ch(in[index])] == NULL)
        return 0;
    return queryTrie(index+1, node->son[ch(in[index])]);
}
 
int triePrefix(int index, trie *node) {
    if (index == len)
        return 0;
 
    if (node->son[ch(in[index])] != NULL)
        return 1+triePrefix(index+1, node->son[ch(in[index])]);
    else
        return 0;
}

bool deleteOnTrie(int index, trie *node) {
	if (index == len) {
		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;
		len = strlen(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<<triePrefix(0, root)<<endl;
		}
	}
}

int main() {
	
	read();

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