Cod sursa(job #664093)

Utilizator batistaUPB-Oprea-Cosmin-Dumitru batista Data 19 ianuarie 2012 17:07:03
Problema Trie Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include<fstream>
#include<string.h>
#include<stdlib.h>
using namespace std;
char sir[30];int maxim=0,nr=0;
struct arb
{
  int info,nrfii; 
  arb*fiu[26]; 
  arb()
  {
	  for(int i=0;i<=26;i++)fiu[i]=0;
	  info=0;
	  nrfii=0;
  }
}*trie;

void insereaza(arb *nd,char *s)// if(fiu[i]) <=> am muchie cu litera *s-'a',adica fiu[3]<=> am muchie cu 'b'
{
  if(*s)
  {
	if(!nd->fiu[*s-'a']) { nd->nrfii++; nd->fiu[*s-'a']=new arb; }
	insereaza(nd->fiu[*s-'a'],s+1);
  }
  else
  {
   nd->info++;
   return;
  }
}
void sterge(arb *nd,char *s)
{
	if(*s)
	   sterge(nd->fiu[*s-'a'],s+1);
	 else
		nd->info--;
}
long numara(arb *nd,char *s)//numarul de aparitii ale lui s
{
	if(*s && nd->fiu[*s-'a'] )return numara(nd->fiu[*s-'a'],s+1);
	else
		return nd->info;
}
void lungime(arb *nd,char *s)//lungimea celui mai lung prefix comun al lui s cu oricare cuvant din lista
{
	if(*s)
	{
		if( nd->info || (nd->nrfii && s+1))maxim=nr;
		if(nd->fiu[*s-'a']) { nr++; lungime(nd->fiu[*s-'a'],s+1);} 
	}
	else
	{
		if(nd->nrfii || nd->info>1)maxim=strlen(sir)-2;
		return;
	}
}
int main()
{
	ifstream f("trie.in");ofstream g("trie.out");
	trie=new arb;
	while(f.getline(sir,30))
	{
		if(sir[0]=='0')insereaza(trie,sir+2);
		  else
		if(sir[0]=='1')sterge(trie,sir+2);
		  else
		if(sir[0]=='2')g<<numara(trie,sir+2)<<"\n";
		  else
		if(sir[0]=='3'){ nr=0; lungime(trie,sir+2); g<<maxim<<"\n";}
	}
	f.close();g.close();
return 0;}