Cod sursa(job #781037)

Utilizator ionut_blesneagIonut Blesneag ionut_blesneag Data 22 august 2012 23:53:32
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include<fstream>
using namespace std;
char buff[30];
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<'a' || *buff>'z')
   {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<'a' || *buff>'z')
   {nod->nr--;}
 else 
 {intc=*buff-'a';
 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<'a' || *buff>'z')
    return nod->nr;
 intc=*buff-'a';
 if(nod->son[intc]!=0)
   return count(nod->son[intc],buff+1);
 return 0;       
}

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


int main()
{freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
while(gets(buff))
{switch(buff[0]-'0')
  {case 0: add(T,buff+2); break;
   case 1: erase(T,buff+2); break;
   case 2: printf("%d\n",count(T,buff+2)); break;
   case 3: printf("%d\n",prefix(T,buff+2,0)); break;}
}

return 0;}