Cod sursa(job #12171)

Utilizator mockeBarca Cristian Mihai mocke Data 3 februarie 2007 00:46:38
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#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 = 0; 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;
}