Cod sursa(job #420114)

Utilizator mihaionlyMihai Jiplea mihaionly Data 18 martie 2010 15:22:26
Problema Trie Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>
using namespace std;
FILE *f=fopen("trie.in","r");
FILE *g=fopen("trie.out","w");
char s[100];
struct trie
 {
 int fii,x;
 trie *tr[26];
 trie()
  {
  fii=x=0;
  for(int i=0;i<26;i++)
   tr[i]=NULL;
  }
 };
trie *T=new trie;
void add(trie *&nod,char *c)
 {
 if(*c=='\n')
  {
  nod->x++;
  return;
  }
 int h=*c-'a';
 if(nod->tr[h]!=NULL)
  {
  nod->fii++;
  add(nod->tr[h],++c);
  }
 else
  {
  //trie *p=new trie;
  nod->tr[h]=new trie;
  nod->fii++;
  add(nod->tr[h],++c);
  }
 }
int del(trie *&nod,char *c)
 {
 if(*c=='\n')
  nod->x--;
 else if(del(nod->tr[int(*c-'a')],c+1)==1)
  {
  nod->tr[int(*c-'a')]=0;
  nod->fii--;
  }
 if(nod->fii==0 && nod!=T && nod->x==0)
  {
  delete nod;
  return 1;
  }
 return 0;
 }  
int query(trie *nod,char *c)
{
 if (*c=='\n' ) 
  return nod->x; 
 else
  {
  int h=*c-'a';
  if(nod->fii!=0&&nod->tr[h]!=0) 
   return query(nod->tr[h],++c);
  }
  return 0;
}
int pref(trie *nod,char *c,int nr)
 {
 if(*c=='\n'||nod->tr[int(*c-'a')]==NULL)
  return nr;
 return pref(nod->tr[int(*c-'a')],c+1,nr+1);
 }
int main()
 {
 while(fgets(s,100,f))
  {
  if(s[0]=='0') add(T,s+2);
  else if(s[0]=='1') del(T,s+2);
  else if(s[0]=='2') fprintf(g,"%d\n",query(T,s+2));
  else if(s[0]=='3') fprintf(g,"%d\n",pref(T,s+2,0));
  }
 return 0;
 }