Pagini recente » Cod sursa (job #450443) | Cod sursa (job #209283) | Cod sursa (job #2780788) | Cod sursa (job #228272) | Cod sursa (job #378122)
Cod sursa(job #378122)
#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]][int(B[p])];
return C[w][A[p]][int(B[p])] == 1;
}
inline int dec(int w, int p)
{
--C[w][A[p]][int(B[p])];
return C[w][A[p]][int(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;
}