Pagini recente » Cod sursa (job #1999553) | Cod sursa (job #1044245) | Cod sursa (job #26912) | Cod sursa (job #938516) | Cod sursa (job #943686)
Cod sursa(job #943686)
#include <fstream>
#include <iostream>
#include <map>
#include <hash_map>
#include <iterator>
#include <algorithm>
#include <vector>
#include <cstring>
#define MAXN ((1<<20) + 1)
#define HASH_SIZE 393241
using namespace std;
//using namespace __gnu_cxx;
unsigned int vec[MAXN];
int minimumSpans[MAXN];
typedef unsigned int uint32;
class HashTable
{
public:
uint32& operator [] (uint32 key)
{
uint32 hash = key % HASH_SIZE;
vector<pair<uint32,uint32> >::iterator it = find_if(table[hash].begin(), table[hash].end(), FindKey(key));
if (it != table[hash].end())
{
return it->second;
}
table[hash].push_back(make_pair(key, 0));
return table[hash][table[hash].size() - 1].second;
}
bool find(uint32 key, uint32& val) const
{
uint32 hash = key % HASH_SIZE;
vector<pair<uint32,uint32> >::const_iterator it = find_if(table[hash].begin(), table[hash].end(), FindKey(key));
if (it != table[hash].end())
{
val = it->second;
return true;
}
return false;
}
void erase(uint32 key, vector<pair<uint32,uint32> >::iterator& it)
{
uint32 hash = key % HASH_SIZE;
table[hash].erase(it);
}
void clear()
{
for (int i=0; i<HASH_SIZE; ++i)
{
table[i].clear();
}
}
private:
struct FindKey
{
FindKey(uint32 key) :
keyToFind(key)
{}
bool operator () (const pair<uint32,uint32>& kvp) const
{
return kvp.first == keyToFind;
}
uint32 keyToFind;
};
vector<pair<uint32,uint32> > table[HASH_SIZE];
};
HashTable mapDistincts;
int main()
{
char buffer[32];
int n, L, U;
long long numSecv = 0;
FILE* fin = fopen ("secv5.in" , "r");
fstream fout("secv5.out", fstream::out);
//fin >> n >> L >> U;
fscanf(fin, "%d %d %d", &n, &L, &U);
//cout << n << " " << L << " " << U << endl;
fgets(buffer, 32, fin);
for (int i=1; i<=n; ++i)
{
//fin >> vec[i];
fgets(buffer, 32, fin);
vec[i] = strtoul(buffer, NULL, 0);
//cout << vec[i] << " ";
}
//cout << endl;
//hash_map<int, int> mapDistincts;
unsigned int distincts = 0;
int span = 1;
for (int i=1; i<=n; ++i)
{
mapDistincts[vec[i]]++;
if (mapDistincts[vec[i]] == 1)
{
distincts++;
}
while (distincts > L-1)
{
mapDistincts[vec[span]]--;
if (mapDistincts[vec[span]] == 0)
{
distincts--;
}
span++;
}
minimumSpans[i] = span;
}
mapDistincts.clear();
//ostream_iterator<int> itOut(cout, " ");
//copy(minimumSpans, minimumSpans + n + 1, itOut);
//cout << endl;
distincts = 0;
span = 1;
for (int i=1; i<=n; ++i)
{
mapDistincts[vec[i]]++;
if (mapDistincts[vec[i]] == 1)
{
distincts++;
}
while (distincts > U)
{
mapDistincts[vec[span]]--;
if (mapDistincts[vec[span]] == 0)
{
distincts--;
}
span++;
}
//maximumSpans[i] = span;
numSecv += (minimumSpans[i] - span);
}
//copy(maximumSpans, maximumSpans + n + 1, itOut);
//cout << endl;
fout << numSecv << "\n";
return 0;
}