Cod sursa(job #1504848)

Utilizator meriniucrMeriniuc Razvan- Dumitru meriniucr Data 18 octombrie 2015 14:26:54
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 kb
//http://www.infoarena.ro/problema/secv5

#include <fstream>
#include <iostream>

#define MOD 666013
using namespace std;

struct element {
	int val;
	int position;
	element *next;
};

element *hash[MOD];
int N, L, U;
int v[1048576];

bool exists(int value, int low, int up)
{
	int pos;
	element *el;

	pos = value % MOD;
	el = hash[pos];
	while (el and el -> val != value)
		el = el -> next;
	while (el and el -> val == value and el -> position <= up)
	{
		if (el -> position >= low and el -> position <= up)
			return true;
		el = el -> next;
	}
	return false;
}

int secv(int lower, int upper, bool up, bool down, int different)
{
	int res;
	int fix;

	fix = 0;
	if (up)
		fix = 1;
	if (upper >= N)
		return 0;
	res = 0;
	if (down)
		if (!exists(v[lower - 1], lower, upper - fix))
			different -= 1;
	if (up)
		if (!exists(v[upper], lower, upper - fix))
			different += 1;
	if (different > U)
		return 0;
	if (different >= L and different <= U)
	{
		cout << lower << " " << upper << " " << different << '\n';
		res = 1;
	}
	res += secv(lower, upper + 1, true, false, different);
	if (upper - lower == L - 1)
		res += secv(lower + 1, upper + 1, true, true, different);
	return res;	
}

element *createElement(int v, int p)
{
	element *e;

	e = new(element);
	e -> val = v;
	e -> position = p;
	return e;
}

void insertInHash(int i, int value, int position)
{
	element *el;
	element *temp;
	element *elem;

	if (hash[i] == NULL)
	{
		hash[i] = createElement(value, position);
		hash[i] -> next = NULL;
		return;
	}
	el = hash[i];
	temp = hash[i];
	while (temp and temp -> val != value)
	{
		el = temp;
		temp = temp -> next;
	}
	while (temp and temp -> val == value)
	{
		el = temp;
		temp = temp -> next;
	}
	elem = createElement(value, position);
	elem -> next = el -> next;
	el -> next = elem;
}

void buildHash(int value, int position)
{
	int positionInHash;

	positionInHash = value % MOD;
	insertInHash(positionInHash, value, position);
}

int main()
{
	ifstream mama("secv5.in");
	ofstream tata("secv5.out");

	int different;

	different = 1;
	mama >> N;
	mama >> L;
	mama >> U;

	for (int i = 0; i < N; i += 1)
	{
		mama >> v[i];
		buildHash(v[i], i);
	}
	for (int i = 1; i < L; i += 1)
		if (!exists(v[i], 0, i - 1))
			different += 1;
	tata << secv(0, L - 1, false, false, different);
	return 0;
}