Pagini recente » Cod sursa (job #2155981) | Cod sursa (job #2475961) | Cod sursa (job #1954110) | Cod sursa (job #2696406) | Cod sursa (job #12173)
Cod sursa(job #12173)
#include <stdio.h>
#include <string.h>
#include <vector>
#define NMAX 666014
#define MMAX (1 << 20) + 1
#define MOD 666013
#define PB push_back
#define MP make_pair
using namespace std;
vector < pair <unsigned int, int> > H[NMAX];
unsigned int A[MMAX];
unsigned int St[MMAX], Used[MMAX], elem;
int N, i, j, nr = 0, s1, s2, num = 0, lg;
int u, l;
long long ru, rl;
char s[20];
int hash (unsigned int x)
{
vector < pair <unsigned int, int> > :: iterator it;
int t = x % MOD;
for (it = H[t].begin(); it != H[t].end(); it++)
if (it->first == x) return (it->second);
H[t].PB( MP(x, ++nr) );
return nr;
}
void add(unsigned int elem, int Limit, long long &sol)
{
St[s2] = elem;
if (Used[elem] == 0) num ++;
Used[elem]++;
if (num > Limit)
{
for (; s1 <= s2 && num > Limit; s1++)
{
Used[St[s1]] --;
if (Used[St[s1]] == 0) num--;
}
}
sol = (long long)sol + s2 + 1 - s1;
s2++;
}
int main()
{
freopen("secv5.in", "r", stdin);
freopen("secv5.out", "w", stdout);
scanf("%d %d %d\n", &N, &l, &u);
for (i = 1; i <= N; i++)
{
gets(s);
lg = strlen(s), elem = 0;
for (j = 1; j < lg; j++) elem = elem * 10 + (s[j] - '0');
A[i] = hash(elem);
}
s1 = s2 = 1;
for (i = 1; i <= N; i++) add(A[i], l-1, rl);
s1 = s2 = 1;
memset(Used, 0, sizeof(Used));
num = 0;
for (i = 1; i <= N; i++) add(A[i], u, ru);
printf("%lld\n", ru - rl);
return 0;
}