Cod sursa(job #256733)

Utilizator Sorin_IonutBYSorynyos Sorin_Ionut Data 12 februarie 2009 06:40:53
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <stdio.h>
#include <iostream.h>

#define IN "trie.in"
#define OUT "trie.out"

FILE *fin=fopen(IN,"r");
FILE *fout=fopen(OUT,"w");

struct Trie
{
 int cnt,nrfii;
 Trie *fiu[30];
 Trie()
 {
  cnt=nrfii=0;
  memset(fiu,0,sizeof(fiu));
 }
};
Trie *T=new Trie;

void ins(Trie *nod,char *s);
int pre(Trie *nod,char *s,int k);
int que(Trie *nod,char *s);
int del(Trie *nod,char *s);

int main()
{
 char cuv[100];
 int op;

 while(!feof(fin))
 {
  fscanf(fin,"%d ",&op);
  fscanf(fin,"%s\n",&cuv);
  switch(op)
  {
   case 0: ins(T,cuv); break;
   case 1: del(T,cuv); break;
   case 2: fprintf(fout,"%d\n",que(T,cuv)); break;
   case 3: fprintf(fout,"%d\n",pre(T,cuv,0)); break;
  }
 }
 return 0;
}

void ins(Trie *nod,char *s)
{
 if(*s==0)
 {
  nod->cnt++;
  return;
 }

 int ch=*s-'a';

 if(nod->fiu[ch]==0)
 {
  nod->fiu[ch]=new Trie;
  nod->nrfii ++;
 }

 ins(nod->fiu[ch],s+1);
}

int pre(Trie *nod,char *s,int k)
{
 if(*s==0 || nod->fiu[*s-'a']==0)
  return k;
 return pre(nod->fiu[*s-'a'],s+1,k+1);
}

int que(Trie *nod,char *s)
{
 if(*s==0)
  return nod->cnt;

 if(nod->fiu[*s-'a'])
  return que(nod->fiu[*s-'a'],s+1);

 return 0;
}

int del(Trie *nod,char *s)
{
 if(*s==0)
  nod->cnt--;
 else
  if(del(nod->fiu[*s-'a'],s+1))
  {
   nod->fiu[*s-'a']=0;
   nod->nrfii--;
  }

  if(nod->cnt==0 && nod->nrfii==0 && nod != T)
  {
   delete nod;
   return 1;
  }
 return 0;
}