Cod sursa(job #420108)

Utilizator mihaionlyMihai Jiplea mihaionly Data 18 martie 2010 15:15:16
Problema Trie Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
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=='\0')
  {
  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=='\0')
  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=='\0' ) 
  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 query(trie *nod,char *c)
 {
 if(nod==NULL)
  return 0;
 if(*c=='\0')
  return nod->x;
 return query(nod->tr[int(*c-'a')],c+1);
 }*/
int pref(trie *nod,char *c,int nr)
 {
 if(*c=='\0'||nod->tr[int(*c-'a')]==NULL)
  return nr;
 return pref(nod->tr[int(*c-'a')],c+1,nr+1);
 }
int main()
 {
 while(f.getline(s,100))
  {
  if(s[0]=='0') add(T,s+2);
  else if(s[0]=='1') del(T,s+2);
  else if(s[0]=='2') g<<query(T,s+2)<<endl;
  else if(s[0]=='3') g<<pref(T,s+2,0)<<endl;
  }
 return 0;
 }