Cod sursa(job #471139)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 17 iulie 2010 15:21:09
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <string.h>
#include <stdio.h>
struct nod
{nod* next[26];
 nod* prev;
 int count;
}*varf;

void init()
{varf=new nod;
 varf->prev=0;
 for (int i=0;i<26;i++)
 {varf->next[i]=0;
 }
 varf->count=0;
}

void adauga(char *cuv)
{nod* p=varf,*q;
 for (char *c=cuv;*c;c++)
 {if(p->next[*c-'a']==NULL)
  {q=new nod;
   q->prev=p;
   q->count=0;
   for (int i=0;i<26;i++)
   {q->next[i]=0;
   }
   p->next[*c-'a']=q;
   p=q;
  }
  else
  {p=p->next[*c-'a'];
  }
 }
 p->count++;
}

void sterge(char *cuv)
{nod* p=varf;
 int l=strlen(cuv)-1,i,flag;
 for (i=0;cuv[i];i++)
 {p=p->next[cuv[i]-'a'];
 }
 p->count--;
 if(p->count==0)
 {do
  {flag=1;
   for (i=0;i<26;i++)
   {if(p->next[i]!=NULL)
    {flag=0;
     break;
    }
   }
   if(flag)
   {p=p->prev;
    delete p->next[cuv[l]-'a'];
    p->next[cuv[l]-'a']=0;
    l--;
   }
  }
  while(flag&&l>=0);
 }
}

int nr_ap(char *cuv)
{int i;
 nod* p=varf;
 for (i=0;cuv[i];i++)
 {p=p->next[cuv[i]-'a'];
 }
 return p->count;
}

int nr_pr(char *cuv)
{int i;
 nod* p=varf;
 for (i=0;cuv[i];i++)
 {if(p->next[cuv[i]-'a']!=NULL)
  {p=p->next[cuv[i]-'a'];}
  else
  {break;
  }
 }
 
 return i;
}

int main ()
{freopen("trie.in","r",stdin);
 freopen("trie.out","w",stdout);
 init();
 int opt;
 char cuv[40];
 while(!feof(stdin))
 {scanf("%d%s\n",&opt,cuv);
  switch(opt)
  {case 0:adauga(cuv);break;//adauga
   case 1:sterge(cuv);break;//sterge
   case 2:printf("%d\n",nr_ap(cuv));break;//nr aparitii
   case 3:printf("%d\n",nr_pr(cuv));break;//cmmdc
  }
 }
 return 0;
}