Cod sursa(job #429514)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 30 martie 2010 11:19:06
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include<fstream>
#include<string>
using namespace std;
int op,T,N,cont;
char cuv[30];

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

void add ()
{
	int i,j,c;
	p=R;
	Trie *nod;
	
	for(i=0;i<N-1;i++)
	{
		c=(int)(cuv[i]-'a');
		if(p->fiu[c]) p=p->fiu[c];
		else
		{
			nod=new Trie;
			nod->inf=0;
			for(j=0;j<26;j++)
				nod->fiu[j]=NULL;
			p->fiu[c]=nod;
			p=nod;
		}
	}
	
	c=(int)(cuv[i]-'a');
	if(p->fiu[c]) { p=p->fiu[c]; p->inf++;}
	else
	{
		nod=new Trie;
		nod->inf=1;
		for(j=0;j<26;j++)
			nod->fiu[j]=NULL;
		p->fiu[c]=nod;
	}
}

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

void del ()
{
	p=R;
	cont=1;
	sterge(p,0);
}

int find ()
{
	p=R;
	int i,c;
	
	for(i=0;i<N;i++)
	{
		c=(int)(cuv[i]-'a');
		p=p->fiu[c];
	}
	return p->inf;
}

int query ()
{
	p=R;
	int i,c,sol=0;
	
	for(i=0;i<N;i++)
	{
		c=(int)(cuv[i]-'a');
		if(p->fiu[c])
		{
			p=p->fiu[c];
			sol=i+1;
		}
		else break;
	}
	return sol;
}

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