Cod sursa(job #331082)

Utilizator Bogdan_tmmTirca Bogdan Bogdan_tmm Data 12 iulie 2009 16:52:50
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include<string>
#include<vector>
#include<fstream>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
string word;
string ::iterator it;
class Trie
{
	inline int CHR(char c)
	{
		return c-'a';
	}
	struct trie
	{
		int nrCuv,nrFii;
		trie *Fii[26];
		trie()
		{
			nrCuv=nrFii=0;
			memset(Fii,0,sizeof(Fii));
		}
	};
	trie rad;
public:
	void add(string word)
	{
		trie *End=&rad;
		End->nrCuv++;
		for(it=word.begin();it!=word.end();it++)
		{
			if(End->Fii[CHR(*it)]==0)
				End->Fii[CHR(*it)]=new trie;
			End=End->Fii[CHR(*it)];
			End->nrCuv++;
		}
		End->nrFii++;
	}
	void Delete(string word)
	{
		trie *End=&rad,*Prev;
		End->nrCuv--;
		int Ok=1;
		for(int i=0;i<word.size();i++)
		{
			Prev=End;
			End=End->Fii[CHR(word[i])];
			End->nrCuv--;
			if(End->nrCuv==0)
			{
				Prev->Fii[CHR(word[i])]=0;
				Ok=0;
				for(i++;i<word.size();i++)
				{
					trie *aux=End;
					End=End->Fii[CHR(word[i])];
					delete aux;
				}
				delete End;
			}
		}
		if(Ok)
			End->nrFii--;
	}
	int GetNr(string word)
	{
		trie *End=&rad;
		for(it=word.begin();it!=word.end();it++)
			End=End->Fii[CHR(*it)];
		return End->nrFii;
	}
	int GetPref(string word)
	{
		trie *End=&rad;
		for(it=word.begin();it!=word.end();it++)
		{
			if(End->Fii[CHR(*it)]==0)
				break;
			End=End->Fii[CHR(*it)];
		}
		return it-word.begin();
	}
};
Trie TRIE;
int main()
{
	int op;
	while(f>>op)
	{
		f>>word;
		switch(op)
		{
		case 0:
			TRIE.add(word);break;
		case 1:
			TRIE.Delete(word);break;
		case 2:
			g<<TRIE.GetNr(word)<<'\n';break;
		case 3:
			g<<TRIE.GetPref(word)<<'\n';break;
		}
	}
	return 0;
}