Cod sursa(job #1189062)

Utilizator mihail.jianuJianu Mihail mihail.jianu Data 21 mai 2014 11:28:55
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.76 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 hL,hR;
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=1,left=0,right=0,diffL=0,diffR=0,res=0;
    while(true){
        left++;
        if(left==n+1)
            break;
        if(!hL.belong(v[left]))
            diffL++;
        hL.push(v[left]);
        if(diffL==low+1)
            break;
    }
    diffL--;
    hL.pop(v[left]);
    left--;
    while(true){
        right++;
        if(right==n+1)
            break;
        if(!hR.belong(v[right]))
            diffR++;
        hR.push(v[right]);
        if(diffR==up+1)
            break;
    }
    diffR--;
    hR.pop(v[right]);
    right--;
    while(i<=n-low+1){
        res+=(right-left+1);
        hL.pop(v[i]);
        hR.pop(v[i]);
        if(!hL.belong(v[i])){
            diffL--;
            while(true){
                left++;
                if(left==n+1)
                    break;
                if(!hL.belong(v[left]))
                    diffL++;
                hL.push(v[left]);
                if(diffL==low+1)
                    break;
            }
            diffL--;
            hL.pop(v[left]);
            left--;
        }
        if(!hR.belong(v[i])){
            diffR--;
            while(true){
                right++;
                if(right==n+1)
                    break;
                if(!hR.belong(v[right]))
                    diffR++;
                hR.push(v[right]);
                if(diffR==up+1)
                    break;
            }
            diffR--;
            hR.pop(v[right]);
            right--;
        }
        i++;
    }
    fprintf(out,"%d",res);
}
int main(){
    init();
    solve();
    return 0;
}