Cod sursa(job #429712)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 30 martie 2010 13:30:10
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 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,*p;

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(i!=N)
		if(ok) nod->fiu[c]=NULL;
			else return;
	
	if(nod==R) return;
	
	ok=0;
	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);
		p=R;
		switch(op)
		{
		case 0: add(p,0); break;
		case 1: 
			ok=0; del(p,0); break;
		case 2: g<<find(p,0)<<'\n'; break;
		case 3: 
			g<<query(p,0)<<'\n'; break;
		}
	}
	
	f.close();
	g.close();
	return 0;
}