Cod sursa(job #378121)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 27 decembrie 2009 16:34:34
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <cstdio>

using namespace std;

const int MAXN = 1 << 20;
const int SHIFT = 14;
const int MAXH = 1 << (32-SHIFT);
const int MAXC = 12;
const int MAXB = 13;
const unsigned int R = 892837121;
    
int N, X, Y;
long long Sol;
unsigned int A[MAXN];
char B[MAXN];
unsigned int H[MAXH][MAXC];
short int C[2][MAXH][MAXC];

inline int addToHash(unsigned int x)
{
    int v = (x * R) >> SHIFT, i;

    for (i = 0; H[v][i] != 0; ++i)
        if (H[v][i] == x) return i;

    H[v][i] = x;
    return i;
}

inline int inc(int w, int p)
{
    ++C[w][A[p]][B[p]];
    return C[w][A[p]][B[p]] == 1;
}

inline int dec(int w, int p)
{
    --C[w][A[p]][B[p]];
    return C[w][A[p]][B[p]] == 0;
}

int main()
{
    freopen("secv5.in", "r", stdin);
    freopen("secv5.out", "w", stdout);

    char buff[MAXB];

    scanf("%d %d %d ", &N, &X, &Y);

    for (int i = 1; i <= N; ++i) 
    {
        fgets(buff, MAXB, stdin);

        for (int j = 0; '0' <= buff[j] && buff[j] <= '9' && j < MAXB; ++j) 
            A[i] = A[i]*10 + buff[j]-'0';

        B[i] = addToHash(A[i]);
        A[i] = (A[i] * R) >> SHIFT;
    }

    int cnt = 0, cnt2 = 0;
    for (int i = 1, j = 1, k = 1; i <= N; ++i)
    {
        cnt += inc(0, i);
        cnt2 += inc(1, i);

        for (; j <= i && cnt > Y; ++j) cnt -= dec(0, j);
        for (; k <= i && cnt2 >= X; ++k) cnt2 -= dec(1, k);

        Sol += k-j;
    }

    printf("%lld\n", Sol);

    return 0;
}