Cod sursa(job #429583)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 30 martie 2010 11:54:31
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<fstream>
#include<string>
using namespace std;

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

struct Trie { int inf; Trie *fiu[30]; } *R,*p,*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)
{
	c=(int)(cuv[i]-'a');
	
	if(i==N) nod->inf--;
	else del(nod->fiu[c],i+1);
	
	if(nod->inf==0)
	{
		int 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(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)
	{
		f>>cuv;
		N=strlen(cuv);
		p=R;
		
		switch(op)
		{
		case 0: add(p,0); break;
		case 1: 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;
}