Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

分享自己满意的一段代码(hash+heap)

Posted by wanba at 2011-01-23 19:59:43 on Problem 3320
#include <cstdio>
#include <cstring>

#define MAX_SIZE 1000001
#define PRIME 99991

struct Node {
	int id;
	int ideaId;
	int index;
	Node *next;
};

struct Item {
	int id;
	int index;

	friend static bool operator < (const Item &a, const Item &b) {
		return (a.index < b.index);
	}

	friend static void swap(Item &a, Item &b) {
		Item tmp;
		tmp.id = a.id;
		tmp.index = a.index;
		a.id = b.id;
		a.index = b.index;
		b.id = tmp.id;
		b.index = tmp.index;
	}
};

Node *ids[MAX_SIZE];
Node nodes[MAX_SIZE];
int nodeSize;
Node *hashes[PRIME];
int size;

class Heap {
public:
	Heap() {
		_size = 0;
	}

	void init() {
		_size = 0;
	}

	void push(Item &item) {
		_vals[_size].id = item.id;
		_vals[_size++].index = item.index;	
		checkHeapPropertyUp(_size-1);
	}

	void push(int id, int index) {
		_vals[_size].id = id;
		_vals[_size++].index = index;	
		checkHeapPropertyUp(_size-1);
	}

	void pop() {
		if (!empty()) {
			_vals[0] = _vals[--_size];
			if (!empty()) {
				checkHeapProperty(0);
			}
		}
	}

	Item top() {
		return (_vals[0]);
	}

	bool empty() {
		return (0 == _size);
	}



private:
	void checkHeapProperty(int index) {
		int left = (index << 1) + 1;
		int right = left + 1;
		if (right < _size && _vals[right] < _vals[index] && _vals[right] < _vals[left]) {
			swap(_vals[right], _vals[index]);
			checkHeapProperty(right);
		} else if (left < _size && _vals[left] < _vals[index]) {
			swap(_vals[left], _vals[index]);
			checkHeapProperty(left);
		}
	}

	void checkHeapPropertyUp(int index) {
		if (0 == index) {
			return;
		}
		int parent = (index-1) >> 1;
		if (_vals[index] < _vals[parent]) {
			swap(_vals[index], _vals[parent]);
			checkHeapPropertyUp(parent);
		}
	}

	int _size;
	Item _vals[MAX_SIZE];
};

Heap heap;

void init()
{
	memset(nodes, 0, sizeof(nodes));
	nodeSize = 0;
	memset(hashes, 0, sizeof(hashes));
	heap.init();
}

Node* getHash(int ideaId)
{
	int index = ideaId % PRIME;
	for (Node *p = hashes[index]; p; p = p->next) {
		if (p->ideaId == ideaId) {
			return (p);
		}
	}
	nodes[nodeSize].id = nodeSize;
	nodes[nodeSize].index = -1;
	nodes[nodeSize].ideaId = ideaId;
	nodes[nodeSize].next = hashes[index];
	hashes[index] = &nodes[nodeSize++];
	return (hashes[index]);
}



int main()
{
	int ideaId, id;

	scanf("%d", &size);
	init();
	for (int i = 0; i < size; ++i) {
		scanf("%d", &ideaId);
		ids[i] = getHash(ideaId);
	}
	int idSize = nodeSize;
	int idCnt = 0;
	int ret = MAX_SIZE;
	for (int i = 0; i < size; ++i) {
		heap.push(ids[i]->id, i);
		if (-1 == ids[i]->index) {
			idCnt ++;
		}
		ids[i]->index = i;
		if (idSize == idCnt) {
			while (ids[heap.top().index]->index != heap.top().index) {
				heap.pop();
			}
			if (i - heap.top().index + 1 < ret) {
				ret = i - heap.top().index + 1;
			}
		}
	}
	printf("%d\n", ret);
	return (0);
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator