Cod sursa(job #1118263)

Utilizator NikitaUtiuNichita Utiu NikitaUtiu Data 24 februarie 2014 09:29:38
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <string>
#include <fstream>
using namespace std;

struct Nod {
	int nr_fii;
	int frecv;
	Nod* fii[26];
	
	Nod(void) {
		frecv = nr_fii = 0;
		for(int i = 0; i < 26; ++i)
			fii[i] = 0;
	}
};

Nod* trie = new Nod();

void insert(Nod* nod, const string& cuv, int poz) {
	if(poz == cuv.size()) {
		++nod->frecv;
		return;
	}
	int fiu = cuv[poz] - 'a';
	if(nod->fii[fiu] == 0) {
		nod->fii[fiu] = new Nod();
		++nod->nr_fii;
	}
	insert(nod->fii[fiu], cuv, poz+1);
}

bool erase(Nod* nod, const string& cuv, int poz) {
	int fiu = cuv[poz] - 'a';
	if(poz == cuv.size()) {
		--nod->frecv;
	}
	else if(erase(nod->fii[fiu], cuv, poz+1)) {
		--nod->nr_fii;
		nod->fii[fiu] = 0;
	}	
	if(nod->frecv == 0 && nod->nr_fii == 0 && nod != trie) {
		delete nod;
		return true;
	}
	return false;
}

int frecv_cuv(Nod* nod, const string& cuv, int poz) {
	if(poz == cuv.size()) 
		return nod->frecv;
		
	int fiu = cuv[poz] - 'a';
	if(nod->fii[fiu] != 0) 
		return frecv_cuv(nod->fii[fiu], cuv, poz+1);
	return 0;
}

int cml_prefix_comun(Nod* nod, const string& cuv, int poz)  {
	if(poz == cuv.size()) 
		return poz;
	else {
		int fiu = cuv[poz] - 'a';
		if(nod->fii[fiu] != 0)
			return cml_prefix_comun(nod->fii[fiu], cuv, poz+1);
		return poz;
	}
}

int main(void) {
	ifstream fin("trie.in");
	ofstream fout("trie.out");
	string cuv; int opt;
	while(fin >> opt) {
		fin >> cuv;
		if(opt == 0)
			insert(trie, cuv, 0);
		if(opt == 1)
			erase(trie, cuv, 0);
		if(opt == 2)
			fout << frecv_cuv(trie, cuv, 0) << '\n';
		if(opt == 3)
			fout << cml_prefix_comun(trie, cuv, 0) << '\n';
	}
	fin.close();
	fout.close();
}