码迷,mamicode.com
首页 > 其他好文 > 详细

unordered_map 哈希函数 / 如何防止 unordered_map 被卡

时间:2020-04-09 15:27:20      阅读:92      评论:0      收藏:0      [点我收藏+]

标签:fixed   and   http   eal   span   codeforce   一个   href   重要   

reference : CF上neal的博客

总所周知,setmap 由于树的结构,的单次操作是 \(O(\log n)\) 的。

有没有更快的 STL 可以代替它们呢?

在 c++11 里面,unordered_setunordered_map 就可以做到单次操作 \(O(1)\)(基于哈希)。

但在 Codeforces 的比赛上面,尽量别用 unoredered_set / unoredered_map

一是因为 unordered_map 本身自带大常数,有时候跑的甚至没有 map 快。

第二个原因也是最重要的原因是,很多 CF 上的大神直接根据 STL 的源代码来造出 hack 数据,导致单次复杂度劣化成 \(O(n)\)

如果你很勇直接用 unordered_map 那么你就等着 fst 吧。


那有没有防止被卡的方法呢?

当然有,那就是自己写哈希函数,然后让哈希函数与时间戳有关就行了。(难道还能预判一个时间来构造 hack 数据不成?

下面给出哈希函数的代码 :

struct custom_hash {
	static uint64_t splitmix64(uint64_t x) {
		x ^= x << 13;
		x ^= x >> 7;
		x ^= x << 17;
		return x; 
	}
	size_t operator () (uint64_t x) const {
		static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count(); // 时间戳
		return splitmix64(x + FIXED_RANDOM);
	}
};

然后再定义 unordered_map 的时候就可以像下面这样定义了 :

unordered_map<uint64_t, int, custom_hash> safe_map;

unordered_map 哈希函数 / 如何防止 unordered_map 被卡

标签:fixed   and   http   eal   span   codeforce   一个   href   重要   

原文地址:https://www.cnblogs.com/Lskkkno1/p/12667149.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!