Cod sursa(job #1189090)

Utilizator mihail.jianuJianu Mihail mihail.jianu Data 21 mai 2014 12:12:59
Problema Secventa 5 Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.65 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;
    bool f=false;
    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(diffLeft<low){
                left++;
                if(left>n){
                    f=true;
                    break;
                }
                if(!hashLeft.belong(v[left]))
                    diffLeft++;
                hashLeft.push(v[left]);
            }
            if(f)
                break;
        }
        if(!hashRight.belong(v[i-1])){
            diffRight--;
            while(diffRight<=up&&right<=n){
                right++;
                if(!hashRight.belong(v[right]))
                    diffRight++;
                hashRight.push(v[right]);
            }
            hashRight.pop(v[right]);
            if(!hashRight.belong(v[right]))
                diffRight--;
            right--;
        }
        res+=right-left+1;
    }
    fprintf(out,"%d",res);
}
int main(){
    init();
    solve();
    return 0;
}