Cod sursa(job #1019436)

Utilizator dunhillLotus Plant dunhill Data 31 octombrie 2013 07:38:52
Problema Trie Scor 25
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>
#include <cstring>
#include <cstdlib>
using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

int i, op, n;

char w[21];

struct nod {
	int ap;
	int erase_ap;
	nod *next[26];
};
nod *root, *T;

void init(nod *&root) {
	root = new nod;
	root->ap = 0;
	root->erase_ap = 0;
	memset(root->next, 0, sizeof(root->next));
}

void insert(nod *root, char a[], int n) {
	T = root;
	for (int i = 0; i < n; ++i) {
		if (T->next[a[i] - 'a'] == NULL) 
			init(T->next[a[i] - 'a']);
		T = T->next[a[i] - 'a'];
		++T->ap;
	}
	++T->erase_ap;
}

void erase(nod *T, int i) {
	T = T->next[w[i] - 'a'];
	if (i == n - 1) {
		--T->erase_ap;
		--T->ap;
		if (T->erase_ap == 0 && T->ap == 0) {
			delete T;
		}
		return;
	}
	erase(T, i + 1);
	--T->ap;
	if (T->ap == 0) {
		delete T;
	}
}

int query(nod *root, char a[], int n) {
	T = root;
	for (int i = 0; i < n; ++i) {
		if (T->next[a[i] - 'a'] == NULL) return 0;
		T = T->next[a[i] - 'a'];
	}
	return T->erase_ap;
}

int prefix (nod *root, char a[], int n) {
	T = root;
	for (int i = 0; i < n; ++i) {
		if (T->next[a[i] - 'a'] == NULL)
			return i;
        T = T->next[a[i] - 'a'];
    }
    return n;
}

int main() {
	init(root);
	while (!fin.eof()) {
		fin >> op;
		fin >> w;
		n = strlen(w);
		if (!op) 
			insert(root, w, n);
		if (op == 1) 
			erase(root, 0);
		if (op == 2)
			fout << query(root, w, n) << '\n';
		if (op == 3)
			fout << prefix(root, w, n) << '\n';
	}
	return 0;
}