Cod sursa(job #1098752)

Utilizator cont_de_testeCont Teste cont_de_teste Data 5 februarie 2014 03:29:39
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

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

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

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

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

bool fq;
inline void del(Trie *&T, int i) {
	if (A[i] == '\0') {
		if (T->s == 0 && T->c == 1) {
			delete T;
			T = '\0';
			return ;
		} else {
			fq = true;
			--T->c;
			return ;
		}
	}
	del(T->son[A[i] - 'a'], i + 1);
	if (fq)
		return ;
	if (i > 1) {
		if (T->s == 1) {
			delete T;
			T = '\0';
		} else {
			--T->s;
			fq = true;
		}
	}
}

inline int nap(Trie *T, int i) {
	if (A[i] == '\0')
		return T->c;
	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 - 1;
	if (!T->son[A[i] - 'a'])
		return i - 1;
	return pre(T->son[A[i] - 'a'], i + 1);
}

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