Cod sursa(job #1335889)

Utilizator ooptNemes Alin oopt Data 6 februarie 2015 00:14:04
Problema Trie Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 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[ch(in[index])])) {
        node->fii--;
        node->son[ch(in[index])] = NULL;
    }
 
    if (node->fii == 0 && node->cnt == 0 && node !=  root) {
        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;
}