@Jacon

Как оптимизировать хеш-функцию для яндекс контеста?

Никак не получается пройти тесты на Яндекс контесте. Сама задача -
Напишите структуру:
struct Circle {
 int x, y, r;
 char color;
 Circle(int x, int y, int r, char color);
}

В этой задаче мы считаем, что два круга равны, если у них совпадают обе координаты, а также
радиус. Круги могут быть двух разных цветов, но если всё остальное совпадает, эти круги
считаются равными
Пример теста:
std::unordered_set<Circle> st;
Circle blue1(5, 6, 7, 'b');
Circle red1(5, 6, 7, 'r');
Circle blue2(6, 5, 7, 'b');
Circle red2(1, 1, 1, 'r');
st.insert(blue1);
assert(st.size() == 1);
st.insert(blue2);
assert(st.size() == 2);
st.insert(red1);
assert(st.size() == 2);
st.insert(red2);
assert(st.size() == 3);

Задача не была бы настолько простой, если бы не следующее:
Подружите эту структуру с std::unordered_set. Иными словами, необходимо написать такой код,
который позволил бы использовать структуру Circle вместе с std::unordered_set, не указывая
никакие дополнительные шаблонные параметры, кроме самого Circle

Моё решение:
#include<unordered_set>
#include<cassert>
struct Circle {
	int x, y, r;
	char color;
	Circle(int x, int y, int r, char color) : x(x), y(y), r(r), color(color) {}
	bool operator== (const Circle& another) const{
		return (x == another.x) && (y == another.y) && (r == another.r);
	}
};
template <>
struct std::hash<Circle> {
	size_t operator()(const Circle& c) const {
		std::hash<int> hash_int;
		std::hash<char> hash_char;
		return hash_int(c.x) ^ hash_int(c.y) ^ hash_int(c.r) ^ hash_char(c.color);
	}
};

Тест из задачи проходит, когда отправляю в систему прилетает RE
Уверен, что это из-за хеширования.
  • Вопрос задан
  • 80 просмотров
Решения вопроса 1
@Jacon Автор вопроса
Сам допёр до решения. Дело было в том, что не надо было хешировать color, т.к. с разным цветом круги считаются равными.
Вот готовое решение:
#include
#include
struct Circle {
int x, y, r;
char color;
Circle(int x, int y, int r, char color) : x(x), y(y), r(r), color(color) {}
bool operator== (const Circle& another) const{
return (x == another.x) && (y == another.y) && (r == another.r);
}
};
template <>
struct std::hash {
size_t operator()(const Circle& c) const {
size_t hash = 17;
hash = hash * 31 + std::hash()(c.x);
hash = hash * 31 + std::hash()(c.y);
hash = hash * 31 + std::hash()(c.r);
return hash;
}
};
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы