Cod sursa(job #590316)

Utilizator ProcopliucProcopliuc Adrian Procopliuc Data 16 mai 2011 20:08:43
Problema Trie Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
# include <fstream>
using namespace std;
ifstream f ("trie.in");
ofstream g ("trie.out");
int n,ok,i,x;
char c[30];
  struct nod 
  {
	  int info;
	  nod *q[26];
	  
	  nod ()
	  {
		  info=0;
		  int i;
		  for (i=0;i<26;i++)
			  q[i]=0;
	  }
	  
  }*p,*v,*w;
  
  
  void adauga (nod *p,char c[30])
  {
	  int i,n;
	  n=strlen (c);
	  i=0;
	  while (p->q[c[i]-97] && i<n)
	  {
		  p=p->q[c[i]-97];
		  i++;
	  }
	  while (i<n)
	  {
		  w=new nod;
		  p->q[c[i]-97]=w;
		  p=w;
		  i++;
	  }
	  p->info++;
  }
  int verif (nod *p)
  {
	  int i;
	  for (i=0;i<26;i++)
		  if (p->q[i])
			  return 1;
		  
	return 0;
  }
  
  
  void sterge (nod *p,char c[30],int i)
  {
	if (i<n)
	sterge (p->q[c[i]-97],c,i+1);
	else
	{
	  p->info--;
	  if (p->info>0)
		  ok=0;
	}
	if (ok==1)
		p->q[c[i]-97]=0;
	if (verif (p)==1)
		ok=0;
	if (ok==1)
		delete p;
	  
  }
  
  int nrap (nod *p,char c[30])
  {
	  int i,n;
	  n=strlen (c);
	  i=0;
	  while (p->q[c[i]-97] && i<n)
	  {
		  p=p->q[c[i]-97];
		  i++;
	  }
	  return p->info;
  }
  
  int prefix (nod *p,char c[30])
  {
	  int i,n;
	  n=strlen (c);
	  i=0;
	  while (p->q[c[i]-97] && i<n)
	  {
		  p=p->q[c[i]-97];
		  i++;
	  }
	  return i;
	  
  }

int main ()
{
	v=new nod;
	while (f>>x)
	{
		f>>c;
		if (x==0)
			adauga (v,c);
		if (x==1)
		{
			ok=1;
			 n=strlen (c);
			sterge (v,c,0);
		}
		if (x==2)
			g<<nrap (v,c)<<"\n";
		if (x==3)
			g<<prefix (v,c)<<"\n";
	}
	return 0;
}