Cod sursa(job #343103)

Utilizator Bogdan_CCebere Bogdan Bogdan_C Data 25 august 2009 01:15:25
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<fstream>
#define CH (*s - 'a')
using namespace std;

struct trie
{int nrfii,cnt;
trie *fiu[26];
trie()
{nrfii=0;cnt=0;memset(fiu,0,sizeof(fiu));
      
      }
       
       };
trie *T=new trie;       
void insert(trie *nod, char *s)
{if(*s=='\n') {nod->cnt++;return;}
if(nod->fiu[CH]==0) {nod->fiu[CH]=new trie;nod->nrfii++; }
insert(nod->fiu[CH],s+1);   
     }       
int remove(trie *nod, char *s)
{if(*s=='\n') nod->cnt--;
else if(remove(nod->fiu[CH],s+1)) {
     nod->fiu[CH]=0;nod->nrfii--;
     }
if(nod->nrfii==0 && nod->cnt==0 && nod!=T)
 {delete nod; return 1;}
 return 0;     
     
     }
int query(trie *nod, char *s)
 {if(*s=='\n') return nod->cnt;
 if(nod->fiu[CH]) return query(nod->fiu[CH],s+1);
              return 0; 
               
               } 
int prefix(trie *nod,char *s, int k)
{if(*s=='\n' || nod->fiu[CH]==0) return k;
else return prefix(nod->fiu[CH],s+1,k+1);
    
    }                        
int main()
{freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
char linie[32];
fgets(linie,32,stdin);
while(!feof(stdin))
{switch(linie[0])
{case '0': {insert(T,linie+2);break;}
case '1': {remove(T,linie+2);break;}
case '2': {printf("%d \n",query(T,linie+2));break;}
case '3':{printf("%d \n",prefix(T,linie+2,0));break;}
default:break;
                 
                 }
                   
                   fgets(linie,32,stdin);}
    
    return 0;}