Cod sursa(job #652814)

Utilizator ChallengeMurtaza Alexandru Challenge Data 26 decembrie 2011 14:07:56
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <fstream>
#include <vector>

using namespace std;

const char InFile[]="secv5.in";
const char OutFile[]="secv5.out";
const unsigned int MaxN=1<<20;
const unsigned int HASH_MOD=3307;

ifstream fin(InFile);
ofstream fout(OutFile);

unsigned int N,L,U,st,dif,v[MaxN],key[MaxN];
long long sol;
vector<unsigned int> H[HASH_MOD];

inline void AddHash(const unsigned int &value, const unsigned int &key)
{
	for(vector<unsigned int>::iterator it=H[key].begin();it!=H[key].end();++it)
	{
		if(*it==value)
		{
			goto OUT;
		}
	}
	++dif;
	OUT:
	H[key].push_back(value);
}

inline void DeleteHash(const unsigned int &value, const unsigned int &key)
{
	register unsigned int i=0;
	for(;i<H[key].size();++i)
	{
		if(H[key][i]==value)
		{
			H[key][i]=H[key][H[key].size()-1];
			H[key].pop_back();
			break;
		}
	}
	for(;i<H[key].size();++i)
	{
		if(H[key][i]==value)
		{
			return;
		}
	}
	--dif;
}

int main()
{
	fin>>N>>L>>U;
	for(register unsigned int i=0;i<N;++i)
	{
		fin>>v[i];
		key[i]=v[i]%HASH_MOD;
		AddHash(v[i],key[i]);
		while(dif>U)
		{
			DeleteHash(v[st],key[st]);
			++st;
		}
		sol+=i-st+1;
	}
	fin.close();

	while(st<N)
	{
		DeleteHash(v[st],key[st]);
		++st;
	}

	dif=0;
	st=0;
	--L;
	for(register unsigned int i=0;i<N;++i)
	{
		AddHash(v[i],key[i]);
		while(dif>L)
		{
			DeleteHash(v[st],key[st]);
			++st;
		}
		sol-=i-st+1;
	}

	fout<<sol;
	fout.close();
	return 0;
}