Cod sursa(job #1098994)

Utilizator cont_de_testeCont Teste cont_de_teste Data 5 februarie 2014 13:45:33
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

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

struct Trie {
	Trie *son[26];
	int let, word;
	Trie() {
		memset(son, '\0', sizeof(son));
		let = word = 0;
	}
};

Trie *T = new Trie;
int Q; char A[30];

inline void add(Trie *&T, int i) {
	++T->let;
	if (A[i] == '\0') {
		++T->word;
		return ;
	}
	if (!T->son[A[i] - 'a'])
		T->son[A[i] - 'a'] = new Trie;
	add(T->son[A[i] - 'a'], i + 1);
}

inline void del(Trie *&T, int i) {
	if (A[i] == '\0') {
		--T->let; --T->word;
		if (T->let == 0) {
			delete T;
			T = '\0';
		}
		return ;
	}
	del(T->son[A[i] - 'a'], i + 1);
	--T->let;
	if (T->let == 0 && i) {
		delete T;
		T = '\0';
	}
}

inline int nap(Trie *T, int i) {
	if (A[i] == '\0')
		return T->word;
	if (!T->son[A[i] - 'a'])
		return 0;
	return nap(T->son[A[i] - 'a'], i + 1);
}

inline int pre(Trie *T, int i) {
	if (A[i] == '\0')
		return i;
	if (!T->son[A[i] - 'a'])
		return i;
	return pre(T->son[A[i] - 'a'], i + 1);
}

int main() {
	while (fin >> Q) {
		fin >> A;
		if (Q == 0)
			add(T, 0);
		else if (Q == 1)
			del(T, 0);
		else if (Q == 2)
			fout << nap(T, 0) << '\n';
		else
			fout << pre(T, 0) << '\n';
	}
	fin.close();
	fout.close();
}