Cod sursa(job #1189083)

Utilizator mihail.jianuJianu Mihail mihail.jianu Data 21 mai 2014 12:02:20
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.43 kb
#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;
}