Cod sursa(job #1112878)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 20 februarie 2014 09:24:57
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

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

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

Trie *T = new Trie;	
char s[22];

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

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

int nrap(Trie *T, int i) {
	if (s[i] == '\0')
		return T->ap;
	return nrap(T->son[s[i] - 'a'], i + 1);
}

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

int main() {
	int op, len;
	while (fin >> op) {
		fin >> s + 1;
		len = strlen(s + 1);
		s[len + 1] = '\0';
		
		if (op == 0)
			add(T, 1);
		else if (op == 1)
			del(T, 1);
		else if (op == 2)
			fout << nrap(T, 1) << '\n';
		else if (op == 3)
			fout << pref(T, 1) << '\n';
	}
	fin.close();
	fout.close();
}