Cod sursa(job #17703)

Utilizator VmanDuta Vlad Vman Data 16 februarie 2007 18:24:17
Problema Secventa 5 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <stdio.h>
#include <math.h>
#include <string.h>
#define dim_hash 500000
#define nmax 1048577
#define golden (sqrt(5)-1)/2

long n,l,u,aparitii[nmax],ind[nmax],key,distincte,hash[dim_hash][10],nou;
unsigned long x[nmax];
long long total1,total2;
char c[10];

void secvente1()
{
long i;
long j=1;
long nr=0;
total1 = n*(n+1)/2;
for (i=1;i<=n;++i)
    {
	      if (aparitii[ind[i]]==0) ++nr;
	      ++aparitii[ind[i]];
      while (nr>l-1)
	    {
	     if (aparitii[ind[j]]==1) --nr;
	     --aparitii[ind[j++]];
            }
      total1 -= j;
    }
}
void secvente2()
{
long i;
long j=1;
long nr=0;
total2=n*(n+1)/2;
for (i=1;i<=n;++i)
    {
	      if (aparitii[ind[i]]==0) ++nr;
	      ++aparitii[ind[i]];
      while (nr>u)
	    {
	     if (aparitii[ind[j]]==1) --nr;
	     --aparitii[ind[j++]];
            }
      total2 -= j;
    }
}

int main()
{
long i,j;
freopen("secv5.in","r",stdin);
scanf("%ld %ld %ld\n",&n,&l,&u);
for (i=1;i<=n;++i)
    {
    scanf("%s\n",c);
    nou=strlen(c);
    j=0;
    while (j<nou)
          {
          x[i]=x[i]*10+(c[j]-'0');
          ++j;
          }
    key=x[i] - (x[i]/dim_hash)*dim_hash;
    nou=0;
    for (j=1;j<=hash[key][0];++j)
    	if (x[i]==x[hash[key][j]]) {
				                 nou=hash[key][j];
                                 break;
                                 }
    if (nou==0)
       {
       hash[key][++hash[key][0]] = i;
       ++distincte;
       ind[i] = distincte;
       }
       else ind[i]=ind[nou];
    }
fclose(stdin);
secvente1();
memset(aparitii,0,sizeof(aparitii));
secvente2();
freopen("secv5.out","w",stdout);
printf("%lld",total2-total1);
fclose(stdout);
return 0;
}