Cod sursa(job #781729)

Utilizator ionut_blesneagIonut Blesneag ionut_blesneag Data 24 august 2012 22:49:24
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include<cstdio>
#include<cstring>
using namespace std;

char buff[32];
int intc;

struct trie
{int nr,nrfii;
trie* son[26];
trie()
{nr=0; nrfii=0;
 for(int psi=0; psi<26; psi++)
   son[psi]=0;}
};

trie *T=new trie;

void add(trie *nod, char *buff)
{if(*buff=='\n')
   {nod->nr++;
    return;}
 intc=*buff-'a';
 if(nod->son[intc]==0)
   {nod->son[intc]=new trie;
   nod->nrfii++;} 
 add(nod->son[intc],buff+1);         
}

int erase(trie *nod, char *buff)
{if(*buff=='\n')
   {nod->nr--;}
 else 
 {intc=*buff-'a';
  if(nod->son[intc])
  if(erase(nod->son[intc],buff+1)==1)
  {nod->son[intc]=0;
   nod->nrfii--;}
 }
 
 if(nod->nr==0 && nod->nrfii==0 && nod!=T) 
   {delete nod;
    return 1;}   
 return 0;     
}

int count(trie *nod, char *buff)
{if(*buff=='\n')
    return nod->nr;
 intc=*buff-'a';
 if(nod->son[intc])
   return count(nod->son[intc],buff+1);
 return 0;       
}

int prefix(trie *nod, char *buff,int grad)
{intc=*buff-'a'; 
 if(*buff=='\n' || nod->son[intc]==0)
   return grad;
 return prefix(nod->son[intc],buff+1,grad+1);
}

int main()
{freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
int caz;
fgets(buff,32,stdin);
while(!feof(stdin))
{
  if(buff[0]=='0') add(T,buff+2); else
  if(buff[0]=='1') erase(T,buff+2); else
  if(buff[0]=='2') printf("%d\n",count(T,buff+2)); else
  if(buff[0]=='3') printf("%d\n",prefix(T,buff+2,0));
  
  fgets(buff,32,stdin);}

return 0;}