Cod sursa(job #652812)

Utilizator ChallengeMurtaza Alexandru Challenge Data 26 decembrie 2011 14:05:56
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 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];
char *ptr,buffer[11534469];

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;
}

inline unsigned int Number()
{
	while(!('0'<=*ptr && *ptr<='9'))
	{
		++ptr;
	}

	unsigned int sol=0;
	while('0'<=*ptr && *ptr<='9')
	{
		sol*=10;
		sol+=*ptr-'0';
		++ptr;
	}
	return sol;
}

int main()
{
	streambuf *pbuf=fin.rdbuf();
	fin.seekg(0, ios::end);
	unsigned int BUFFERSIZE=(int)(fin.tellg());
	ptr=buffer;
	fin.seekg(0, ios::beg);
	pbuf->sgetn(buffer,BUFFERSIZE);
	fin.close();

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

	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;
}