Pagini recente » Cod sursa (job #985740) | Cod sursa (job #641188) | Cod sursa (job #188534) | Cod sursa (job #1718694) | Cod sursa (job #1189083)
#include<cstdio>
const int N=1<<20,K=666013;
class Hash{
public:
unsigned int list[K+1],val[N+1],next[N+1];
unsigned int nr;
void push(unsigned int x){
unsigned int r=x%K;
this->val[++this->nr]=x;
this->next[nr]=this->list[r];
this->list[r]=this->nr;
}
void pop(unsigned int x){
unsigned int r=x%K,p;
if(x==val[list[r]])
list[r]=next[list[r]];
else{
p=list[r];
while(next[p]!=0&&val[next[p]]!=x)
p=next[p];
next[p]=next[next[p]];
}
}
bool belong(unsigned int x){
unsigned int p=list[x%K];
while(p!=0&&val[p]!=x)
p=next[p];
return p!=0;
}
};
Hash hashLeft,hashRight;
unsigned int v[N+1];
FILE*in,*out;
int n,low,up;
void scan(){
int i;
fscanf(in,"%d%d%d",&n,&low,&up);
for(i=1;i<=n;i++)
fscanf(in,"%u",&v[i]);
}
void init(){
in=fopen("secv5.in","r");
out=fopen("secv5.out","w");
scan();
}
void solve(){
int i,diffLeft=0,left=0,diffRight=0,right=0,res;
while(diffLeft<low){
left++;
if(!hashLeft.belong(v[left])&&left<n)
diffLeft++;
hashLeft.push(v[left]);
}
while(diffRight<=up&&right<=n){
right++;
if(!hashRight.belong(v[right]))
diffRight++;
hashRight.push(v[right]);
}
diffRight--;
hashRight.pop(v[right]);
right--;
res=right-left+1;
for(i=2;i<=n;i++){
hashLeft.pop(v[i-1]);
hashRight.pop(v[i-1]);
if(!hashLeft.belong(v[i-1])){
diffLeft--;
while(v[left]==v[left+1]&&left+1<=n){
left++;
hashLeft.push(v[left]);
}
if(left==n)
break;
left++;
diffLeft++;
hashLeft.push(left);
}
if(!hashRight.belong(v[i-1]))
if(right!=n){
right++;
hashRight.push(right);
while(v[right]==v[right+1]&&right+1<=n){
right++;
hashRight.push(v[right]);
}
}
res+=right-left+1;
}
fprintf(out,"%d",res);
}
int main(){
init();
solve();
return 0;
}