Cod sursa(job #429649)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 30 martie 2010 12:45:13
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include<fstream>
#include<string>
using namespace std;

int op,N,c,j,cuvant,ok;
char cuv[30];

struct Trie { int inf; Trie *fiu[30]; } *R,*nou;

void add (Trie *&nod, int i)
{
	c=(int)(cuv[i]-'a');

	if(i==N)
	{
		nod->inf++;
		return ;
	}
	
	if(nod->fiu[c]==NULL)	
	{
		nou=new Trie;
		nou->inf=0;
		for(j=0;j<26;j++)
			nou->fiu[j]=NULL;
		nod->fiu[c]=nou;
	}
		
	add(nod->fiu[c],i+1);
}

void del (Trie *&nod, int i)
{
	int c=(int)(cuv[i]-'a');
	
	if(i==N) nod->inf--;
	
		else del(nod->fiu[c],i+1);
	
	if(ok && i!=N) nod->fiu[c]=NULL;
		else return;
	
	if(nod->inf==0)
	{
		ok=1;
		
		for(j=0;j<26&&ok;j++)
			if(nod->fiu[j]) ok=0;
		
		if(ok)
		{
			delete nod;
			nod=NULL;
		}
	}
}

int find (Trie *nod, int i)
{
	c=(int)(cuv[i]-'a');
	
	if(i==N) return nod->inf;
	if(nod->fiu[c]) return find(nod->fiu[c],i+1);
	return 0;
}

int query (Trie *nod,int i)
{
	c=(int)(cuv[i]-'a');
	if(i==N) return N;
	if(nod->fiu[c]) return query(nod->fiu[c],i+1);
	return i;
}

int main()
{
	ifstream f("trie.in");
	ofstream g("trie.out");
	
	R=new Trie;
	R->inf=0;
	for(j=0;j<26;j++)
		R->fiu[j]=NULL;
	
	while(f>>op)
	{
		cuvant++;
		for(j=0;j<30;j++)
			cuv[j]='\0';
		f>>cuv;
		N=strlen(cuv);
		
		switch(op)
		{
		case 0: add(R,0); break;
		case 1: ok=0; del(R,0); break;
		case 2: g<<find(R,0)<<'\n'; break;
		case 3: g<<query(R,0)<<'\n'; break;
		}
	}
	
	f.close();
	g.close();
	return 0;
}