Cod sursa(job #1332022)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 1 februarie 2015 15:45:10
Problema Secventa 5 Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <stdio.h>
#define HASH 2093570
#define MAXN 1048576
unsigned int val[2*MAXN+1], v[MAXN+1];
int hash1[HASH], hash2[HASH], next[2*MAXN+1], fr[2*MAXN+1], m;
inline int exista(unsigned int x, int lista[]){
    int p=lista[x%HASH], f=0;
    while((p!=0)&&(f==0)){
        if(val[p]==x){
            f=fr[p];
        }
        p=next[p];
    }
    return f;
}
inline void adauga(unsigned int x, int lista[]){
    int p=lista[x%HASH], f=0;
    while((p!=0)&&(f==0)){
        if(val[p]==x){
            f=p;
        }
        p=next[p];
    }
    if(f!=0){
        fr[f]++;
    }else{
        val[++m]=x;
        fr[m]=1;
        next[m]=lista[x%HASH];
        lista[x%HASH]=m;
    }
}
inline void scoate(unsigned int x, int lista[], int *e){
    int p=lista[x%HASH], f=0;
    if(val[p]==x){
        fr[p]--;
        if(fr[p]==0){
            (*e)--;
        }
    }else{
        while((next[p]!=0)&&(f==0)){
            if(val[next[p]]==x){
                f=p;
            }
            p=next[p];
        }
        fr[next[f]]--;
        if(fr[next[f]]==0){
            (*e)--;
        }
    }
}
int main(){
    int n, l, u, a, b, p, q, i;
    long long ans;
    FILE *fin, *fout;
    fin=fopen("secv5.in", "r");
    fout=fopen("secv5.out", "w");
    fscanf(fin, "%d%d%d", &n, &l, &u);
    for(i=1; i<=n; i++){
        fscanf(fin, "%u", &v[i]);
    }
    a=b=p=q=ans=0;
    for(i=1; i<=n; i++){
        while((a<l)&&(p<n)){
            p++;
            if(exista(v[p], hash1)==0){
                a++;
            }
            adauga(v[p], hash1);
        }
        while((q<n)&&((b<u)||((b==u)&&(exista(v[q+1], hash2)!=0)))){
            q++;
            if(exista(v[q], hash2)==0){
                b++;
            }
            adauga(v[q], hash2);
        }
        if(a==l){
            ans+=q-p+1;
        }
        scoate(v[i], hash1, &a);
        scoate(v[i], hash2, &b);
    }
    fprintf(fout, "%lld\n", ans);
    fclose(fin);
    fclose(fout);
    return 0;
}