Cod sursa(job #1489670)

Utilizator DacianBocea Dacian Dacian Data 21 septembrie 2015 20:31:17
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#include <cstring>
#include <string>


using namespace std;

class trie{
public:
	int cnt, nrf;
	trie* childs[26];
	trie(){
		cnt = nrf = 0;
		memset(childs, 0, sizeof(childs));
	}
};
trie* root = new trie();

void add(string& a,int j,trie* c){
	if (j == a.size()){
			++c->cnt; return;
	}
	else if (!c->childs[a[j] - 'a']){
			++c->nrf;
			trie* d = new trie();
			c->childs[a[j] - 'a'] = d;
		}
		add(a, j + 1, c->childs[a[j] - 'a']);
	}
	int nr(string& a, int j, trie* c){
		if (j == a.size()){
			return c->cnt;
		}
		else if (!c->childs[a[j] - 'a']) return 0;
		else return nr(a, j + 1, c->childs[a[j] - 'a']);
	}
	int tip(string& a, int j, trie* c){
		if (j == a.size()){
			return j;
		}
		else if (!c->childs[a[j] - 'a']) return j;
		else return tip(a, j + 1, c->childs[a[j] - 'a']);
	}
	bool del(string& a, int j, trie* c){
		if (j == a.size()) --c->cnt;
		else if (c->childs[a[j] - 'a']!=0 && del(a, j + 1, c->childs[a[j] - 'a'])){
			--c->nrf;
			c->childs[a[j] - 'a'] = 0;
		}
		if (c != root && !c->nrf && !c->cnt){
			delete c; return 1;
		}
		return 0;
	}


int main(){
	ifstream f("trie.in");
	ofstream of("trie.out");
	
	int a; string b;
	while (f >> a >> b){
		if (a == 0) add(b, 0, root);
		else if (a == 1) del(b, 0, root);
		else if (a == 2) of << nr(b, 0, root) << "\n";
		else of << tip(b, 0, root) << "\n";
	}

}