Cod sursa(job #1370203)

Utilizator abel1090Abel Putovits abel1090 Data 3 martie 2015 13:25:32
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
///TRIE
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

struct Trie {
	int num, numChild;
	bool isRoot;
	vector<Trie*> adj;

	Trie(bool r) {
		num = numChild = 0;
		isRoot = r;
		adj.resize(26);
		for(int i=0; i<26; ++i)
			adj[i] = NULL;	
	}

	void _insert(string::iterator i, string::iterator j);
	void _delete(string::iterator i, string::iterator j);
	int _count(string::iterator i, string::iterator j);
	int _getMaxPref(string::iterator i, string::iterator j);
};

void Trie::_insert(string::iterator i, string::iterator j) {
	if(i == j) {
		++num;
		return;
	}	
	if(adj[*i-'a'] == NULL) {
		adj[*i-'a'] = new Trie(false);
		++numChild;
	}
	adj[*i-'a']->_insert(i+1, j);
}

void Trie::_delete(string::iterator i, string::iterator j) {
	if(i == j) {
		--num;
		///if(!num && !numChild)
			///delete this;
		return;
	}
	
	adj[*i-'a']->_delete(i+1, j);
	if(!adj[*i-'a']->num && !adj[*i-'a']->numChild) {
		delete adj[*i-'a'];	
		--numChild;
		adj[*i-'a'] = NULL;
	}		
}

int Trie::_count(string::iterator i, string::iterator j) {
	if(i == j) 
		return num;
	
	if(adj[*i-'a'] == NULL)
		return 0;
	
	return adj[*i-'a']->_count(i+1, j);
}

int Trie::_getMaxPref(string::iterator i, string::iterator j) {	
	if(adj[*i-'a'] != NULL && i != j)
		return adj[*i-'a']->_getMaxPref(i+1, j) + 1;
	return 0;
}

int main() {
	ifstream inStr("trie.in");
	ofstream outStr("trie.out");

	string w;
	int tp;
	Trie t(true);

	while(inStr >> tp >> w) {
		///inStr >> tp >> w;
		switch(tp) {
		case 0: t._insert(w.begin(), w.end()); break;
		case 1: t._delete(w.begin(), w.end()); break;
		case 2: outStr << t._count(w.begin(), w.end()) << '\n'; break;
		case 3: outStr << t._getMaxPref(w.begin(), w.end()) << '\n'; break;
		}
	}

	return 0;
}