Cod sursa(job #572477)

Utilizator irene_mFMI Irina Iancu irene_m Data 5 aprilie 2011 12:37:10
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <cstdio>
#include <cstring>
#define MaxN 100002
#define MaxL 26
#define infile "trie.in"
#define outfile "trie.out"

struct Trie{
      int nc,nr;
      Trie *fiu[MaxL];

      Trie()
      {
            nc=nr=0;
            memset(fiu,0,sizeof(fiu));
      }
}     *T=new Trie;

char s[MaxL];

void add(Trie *q,char s[])
{
      if(s[0]=='\n')
      {
            q->nr++;
            return;
      }

      if(!q->fiu[*s-'a'])
      {
            q->nc++;
            q->fiu[*s-'a']=new Trie;
      }

      add(q->fiu[*s-'a'],s+1);
}

int del(Trie *q,char s[])
{
      if(s[0]=='\n')
            q->nr--;
      else
            if(del(q->fiu[*s-'a'],s+1))
            {
                  q->fiu[*s-'a']=0;
                  q->nc--;
            }

      if(q->nr==0 && q->nc==0 && q!=T)
      {
            delete q;
            return 1;
      }
      return 0;
}

int aparitii(Trie *q,char s[])
{
      if(s[0]=='\n')
            return q->nr;

      if(q->fiu[*s-'a'])
            return aparitii(q->fiu[*s-'a'],s+1);
      return 0;
}


int prefix(Trie *q,char s[],int n)
{
      if(s[0]=='\n') return n;

      if(!q->fiu[*s-'a']) return n;

      Trie *w=q->fiu[*s-'a'];
      return prefix(w,s+1,n+1);
}

int main()
{
      freopen(infile,"r",stdin);
      freopen(outfile,"w",stdout);

      fgets(s,MaxL,stdin);

      while(!feof(stdin))
      {
            if(s[0]=='0')
                  add(T,s+2);
            if(s[0]=='1')
                  del(T,s+2);
            if(s[0]=='2')
                  printf("%d\n",aparitii(T,s+2));
            if(s[0]=='3')
                  printf("%d\n",prefix(T,s+2,0));

            fgets(s,MaxL,stdin);
      }

      fclose(stdin);
      fclose(stdout);
      return 0;
}