Cod sursa(job #778729)

Utilizator ctlin04UAIC.VlasCatalin ctlin04 Data 15 august 2012 18:18:14
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <cstdio>
#include <cstring>
using namespace std;
#define dim 100005
char sir[dim];
 struct trie {
      int cnt, nr_fii;
        trie *fiu[26];
       trie(){
          cnt=nr_fii=0;
           memset(fiu,0,sizeof(fiu));
             }
           };
trie *T=new trie;

void insert(trie *nod, char *p){
   if(*p=='\n') { nod->cnt++; return ;}
   if( nod->fiu[*p-'a']==0){
          nod->fiu[*p-'a']=new trie;
           nod->nr_fii++;
                    }
   insert(nod->fiu[*p-'a'],p+1);
  }
int sterge(trie *nod, char *p){
     if(*p=='\n') nod->cnt--;
      else if(sterge(nod->fiu[*p-'a'],p+1)){
               nod->fiu[*p-'a']=0;
               nod->nr_fii--;
       }
     if(nod->cnt==0 && nod->nr_fii==0 && nod!=T){
      delete nod; return 1;
      }
 return 0;
}
int aparitii(trie *nod, char *p){
    if(*p=='\n')return nod->cnt;
       if(nod->fiu[*p-'a']!=0)
          return aparitii(nod->fiu[*p-'a'],p+1);
 return 0;
}
int prefix(trie *nod, char *p,int k){
    if(*p=='\n' || nod->fiu[*p-'a']==0) return k;
      return prefix(nod->fiu[*p-'a'],p+1,k+1);
}

int main(void){
   freopen("trie.in","r",stdin);
   freopen("trie.out","w",stdout);
    while(fgets(sir,dim,stdin)){
     if(sir[0]=='0')insert(T,sir+2);
     if(sir[0]=='1')sterge(T,sir+2);
     if(sir[0]=='2')printf("%d\n", aparitii(T,sir+2));
     if(sir[0]=='3')printf("%d\n", prefix(T,sir+2,0));
    }
  return 0;
}