Cod sursa(job #897943)

Utilizator andreitulusAndrei andreitulus Data 27 februarie 2013 23:13:00
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include<stdio.h>
#include<string.h>

int n,m,k;
char x[30];

struct trie{
    int nr,nrf;
    trie *f[26];

    trie()
    {
      nr=nrf=0;
      memset(f,0,sizeof(f));

    }
};
trie *r;





void adaug()
{
    trie *q;
    int i;

    q=r;
    for(i=0;i<m;i++)
    {
      if(q->f[x[i]-'a']==0)
      {
          q->nrf++;
          q->f[x[i]-'a']=new trie();
      }
     q=q->f[x[i]-'a'];
    }
 q->nr++;
}




int numar()
{
    trie *q;
    int i;

    q=r;
    for(i=0;i<m;i++)
     if(q->f[x[i]-'a']==0)
       return 0;
     else
         q=q->f[x[i]-'a'];

 return q->nr;
}




int prefix()
{
    trie *q;
    int i;

    for(i=0;i<m;i++)
      if(q->f[x[i]-'a']==0)
        return i;
      else
          q=q->f[x[i]-'a'];

return m;
}



void sterge(trie *q,int i)
{
    if(i==m)
      q->nr--;
    else
    {
        sterge(q->f[x[i]-'a'],i+1);

        if(q->f[x[i]-'a']->nr==0 && q->f[x[i]-'a']->nrf==0)
        {
            delete q->f[x[i]-'a'];
            q->f[x[i]-'a']=0;
            q->nrf--;
        }
    }
}





int main()
{
    FILE *f,*g;

    f=fopen("trie.in","r");
    g=fopen("trie.out","w");

    r=new trie();

    while(!feof(f))
    {
        fscanf(f,"%d %s",&k,x);
        if(feof(f))
         break;

        m=strlen(x);

        if(k==0)
          adaug();
        if(k==1)
          sterge(r,0);
        if(k==2)
          fprintf(g,"%d\n",numar());
        if(k==3)
          fprintf(g,"%d\n",prefix());
    }


    fclose(f);
    fclose(g);
    return 0;


}