Pagini recente » Cod sursa (job #1887375) | Cod sursa (job #100710) | Cod sursa (job #2883500) | Cod sursa (job #1828707) | Cod sursa (job #1764649)
#include <stdio.h>
#define MOD 2093570
#define MAX_N 1048576
unsigned int v[MAX_N],val[2*MAX_N+1];
int hash1[MOD],hash2[MOD],next[2*MAX_N+1],frecv[2*MAX_N+1],m;
int caut(unsigned int x,int *e)
{
int p;
p=*e;
while(p && val[p]!=x)
p=next[p];
return frecv[p];
}
void add(unsigned int x,int *e)
{
int p=*e;
while(p && val[p]!=x)
p=next[p];
if(!p)
{
val[++m]=x;
frecv[m]=1;
next[m]=*e;
*e=m;
}
else
frecv[p]++;
}
void sterg(unsigned int x,int list[],int *e)
{
int p;
p=list[x%MOD];
if(val[p]==x)
{
frecv[p]--;
if(!frecv[p])
(*e)--;
}
else
{
while(next[p] && val[next[p]]!=x)
p=next[p];
if(next[p])
{
frecv[next[p]]--;
if(!frecv[next[p]])
(*e)--;
}
}
}
int main()
{
FILE *fin,*fout;
fin=fopen("secv5.in","r");
fout=fopen("secv5.out","w");
int n,l,u,a,b,i,p,q;
long long co;
fscanf(fin,"%d%d%d",&n,&l,&u);
for(i=0;i<n;i++)
fscanf(fin,"%u",&v[i]);
a=b=p=q=co=0;
for(i=0;i<n;i++)
{
while(a<l && p<n)
{
if(!caut(v[p],&hash1[v[p]%MOD]))
a++;
add(v[p],&hash1[v[p]%MOD]);
p++;
}
while(q<n && (b<u || (b==u && caut(v[q],&hash2[v[q]%MOD]))))
{
if(!caut(v[q],&hash2[v[q]%MOD]))
b++;
add(v[q],&hash2[v[q]%MOD]);
q++;
}
if(a==l)
co+=q-p+1;
sterg(v[i],hash1,&a);
sterg(v[i],hash2,&b);
}
fprintf(fout,"%lld",co);
fclose(fin);
fclose(fout);
return 0;
}