Cod sursa(job #39427)

Utilizator stef2nStefan Istrate stef2n Data 26 martie 2007 18:35:34
Problema Oite Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <stdio.h>

#define infile "oite.in"
#define outfile "oite.out"
#define CMAX 1025
#define HASH_MIC 509
#define HASH_MARE 262153
struct NOD_HASH{int val,count; NOD_HASH *adr;};

FILE *fin,*fout;
int C,L;
int x[CMAX];
NOD_HASH *hash[HASH_MIC],*HASH[HASH_MARE];
int SOL=0;

void citire()
  {
   fin=fopen(infile,"r");
   fscanf(fin,"%d %d",&C,&L);
   for(int i=0;i<C;i++)
      fscanf(fin,"%d",&x[i]);
   fclose(fin);
  }

inline int h1(int x)
  {
   int aux=x%HASH_MIC;
   if(aux>=0)
     return aux;
   return aux+HASH_MIC;
  }

inline int h2(int x)
  {
   int aux=x%HASH_MARE;
   if(aux>=0)
     return aux;
   return aux+HASH_MARE;
  }

void insert_hash(NOD_HASH *(&prim), int x)
  {
   NOD_HASH *b=prim;
   while(b)
        {
         if(b->val==x)
           {
            b->count++;
            return;
           }
         b=b->adr;
        }
   b=new NOD_HASH;
   b->val=x;
   b->count=1;
   b->adr=prim;
   prim=b;
  }

int search_hash(NOD_HASH *prim, int x)
  {
   NOD_HASH *b=prim;
   while(b)
        {
         if(b->val==x)
           return b->count;
         b=b->adr;
        }
   return 0;
  }

void init()
  {
   int i,j;
   for(i=0;i<HASH_MIC;i++)
      hash[i]=NULL;
   for(i=0;i<HASH_MARE;i++)
      HASH[i]=NULL;
   for(i=0;i<C;i++)
      insert_hash(hash[h1(x[i])],x[i]);
   for(i=0;i<C;i++)
      for(j=i+1;j<C;j++)
         insert_hash(HASH[h2(x[i]+x[j])],x[i]+x[j]);
  }

void solve()
  {
   int i,j,aux,S;
   for(i=0;i<C;i++)
      for(j=i+1;j<C;j++)
         {
          S=L-x[i]-x[j];
          aux=search_hash(HASH[h2(S)],S);
          SOL+=aux;
          if(aux)
            {
             SOL-=search_hash(hash[h1(S-x[i])],S-x[i]);
             if(S-x[i]==x[i])
               SOL++;
             SOL-=search_hash(hash[h1(S-x[j])],S-x[j]);
             if(S-x[j]==x[j])
               SOL++;
             if(S==x[i]+x[j])
               SOL++;
            }
         }
  }


int main()
{
citire();
init();
solve();
fout=fopen(outfile,"w");
fprintf(fout,"%d\n",SOL/6);
fclose(fout);
return 0;
}