Cod sursa(job #890681)

Utilizator alexandrul_21Niculescu Mihai alexandrul_21 Data 25 februarie 2013 11:16:35
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#include <stdio.h> #include <string.h> struct nod{     int nr;     nod * next[30]; }*First; int Convert(char c){     return c-'a'+1; } void Insert(nod *p,char s[30],int k){     int n=strlen(s);     if(k>=n){         p->nr++;         return;     }     int ac=Convert(s[k]);     if(p->next[ac]==0){         nod *q=new nod;         q->nr=0;         memset(q->next,0,sizeof(p->next));         p->next[ac]=q;         Insert(p->next[ac],s,k+1);     }     else        Insert(p->next[ac],s,k+1); } int IsValidDelete(nod *p){     if(p->nr>0)         return 0;     int i;     for(i=1;i<=26;i++)         if(p->next[i]!=0)             return 0;     return 1; } int Delete(nod *p,char s[30],int k){     int n=strlen(s);     if(k>=n){         p->nr--;         if(p->nr<0)             p->nr=0;         return p->nr;     }     int ac=Convert(s[k]);     int sw=Delete(p->next[ac],s,k+1);     if(sw<1){         nod *q=p->next[ac];         if(IsValidDelete(q)){             p->next[ac]=0;             delete q;             return p->nr;         }     }     return 1; } int Write(nod *p,char s[30],int k){     if(p==0)         return 0;     int n=strlen(s);     if(k>=n){         return p->nr;     }     int ac=Convert(s[k]);     return Write(p->next[ac],s,k+1); } int WritePrefix(nod *p,char s[30],int k){     if(p==0)         return k-1;     int n=strlen(s);     if(k>=n){         return n;     }     int ac=Convert(s[k]);     return WritePrefix(p->next[ac],s,k+1); } void Read(){     freopen("trie.in","r",stdin);     freopen("trie.out","w",stdout);     First=new nod;     First->nr=0;     memset(First->next,0,sizeof(First->next));     char s[30];     int nr;     while(!feof(stdin)){         scanf("%d %s\n",&nr,s);           if(nr==0){             Insert(First,s,0);         }         else if(nr==1){             Delete(First,s,0);         }         else if(nr==2){             printf("%d\n",Write(First,s,0));         }         else if(nr==3){             printf("%d\n",WritePrefix(First,s,0));         }     }     fclose(stdin);     fclose(stdout); } int main() {     Read();     return 0; } 
.