Pagini recente » Cod sursa (job #311023) | Cod sursa (job #3237947) | Cod sursa (job #228282) | Cod sursa (job #2880157) | Cod sursa (job #378121)
Cod sursa(job #378121)
#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;
}