P2580 于是他错误的点名开始了
题目介绍
给出 \(n\) 互不相同个字符串,询问 \(m\) 次,每次询问一个字符串是否存在,如存在判断是否已经询问过。
\(n\le 10^4,m\le 10^5\)。
做法 1
用 map
或 unordered_map
。
用 unordered_map
时间复杂度为 \(O(n+m)\),实测 461ms。
做法 2
哈希表。
每个给定的字符串,算出字符串 hash 值,mod 一个空间范围允许的质数作为 key,然后把字符串本身和 key 存到哈希表里。
询问就在哈希表中查询即可。
时间复杂度 \(O(len(n+m))\),实测 544ms(因为哈希冲突较多,影响时间)。
做法 3
本题正解,字典树(trie)。
把给定字符串加入字典树,询问就在字典树中查询。
时间复杂度 \(O(len(n+m))\),实测 366ms(时间最短)。
标签:map,code,点名,P2580,错误,复杂度,哈希,字符串 From: https://www.cnblogs.com/liyixin0514/p/18468563