Cod sursa(job #749526)

Utilizator BitOneSAlexandru BitOne Data 17 mai 2012 16:42:34
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include <string>
#include <fstream>
#include <cstdlib>

using namespace std;
typedef string::iterator siterator;
typedef string::const_iterator csiterator;

class Trie {
	bool isRoot;
	Trie *nods[30];
	int countAp, countSet;
	
	bool Del(csiterator it, csiterator iend)
	{
		if(it >= iend)
		{
			--countAp;
			return 0 == countAp && 0 == countSet;
		}
		int indexC=*it-'a';
		if(true == nods[indexC]->Del(it+1, iend))
		{
			--countSet;
			delete nods[indexC];
			nods[indexC]=NULL;
		}
		if(!isRoot && 0 == countAp && 0 == countSet)
			return true;
		return false;
	}
public:
	Trie() {
		isRoot=true;
		countAp=countSet=0;
		for(int i=0; i < 30; ++i)
			nods[i]=NULL;
	}
	void Add(csiterator it, csiterator iend)
	{
		if(it >= iend)
			++countAp;
		else {
				int indexC=*it-'a';
				if(NULL == nods[indexC])
					nods[indexC]=new Trie(), ++countSet;
				nods[indexC]->isRoot=false;
				nods[indexC]->Add(it+1, iend);
			 }
	}
	void Delete(csiterator it, csiterator iend) {Del(it, iend);}
	int CountAp(csiterator it, csiterator iend)
	{
		if(it >= iend)
			return countAp;
		else {
				int indexC=*it-'a';
				if(NULL == nods[indexC])
					return 0;
				return nods[indexC]->CountAp(it+1, iend);
			 }
	}
	int LCP(csiterator it, csiterator iend)
	{
		if(it >= iend)
			return 0;
		else {
				int indexC=*it-'a';
				if(NULL == nods[indexC])
					return 0;
				return 1+nods[indexC]->LCP(it+1, iend);
			 }
	}
} root;

int main()
{
	int op;
	string s;
	ifstream in("trie.in");
	ofstream out("trie.out");
	
	while(in>>op>>s)
	{
		switch(op)
		{
			case 0: root.Add(s.begin(), s.end()); break;
			case 1: root.Delete(s.begin(), s.end()); break;
			case 2: out<<root.CountAp(s.begin(), s.end())<<'\n'; break;
			case 3: out<<root.LCP(s.begin(), s.end())<<'\n';
		}
	}
	return EXIT_SUCCESS;
}