HDU1880(HASH+unordered_map)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1880

题目信息:

Problem Description

哈利波特在魔法学校的必修课之一就是学习魔咒。据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮助。
给你一部魔咒词典。当哈利听到一个魔咒时,你的程序必须告诉他那个魔咒的功能;当哈利需要某个功能但不知道该用什么魔咒时,你的程序要替他找到相应的魔咒。如果他要的魔咒不在词典中,就输出“what?”

Input

首先列出词典中不超过100000条不同的魔咒词条,每条格式为:
[魔咒] 对应功能
其中“魔咒”和“对应功能”分别为长度不超过20和80的字符串,字符串中保证不包含字符“[”和“]”,且“]”和后面的字符串之间有且仅有一个空格。词典最后一行以“@END@”结束,这一行不属于词典中的词条。
词典之后的一行包含正整数N(<=1000),随后是N个测试用例。每个测试用例占一行,或者给出“[魔咒]”,或者给出“对应功能”。

思路:首先如果这道题数据量很小,每个字符串长度不大情况下,直接使用map就可以A了,但是我们看一下数据量,1e5的词条,串长度不超过101,询问还有1e3,这样直接造成MLE/TLE,在这里我们使用字符串HASH,同时采用unordered_map,下面有两种map的区别小结,总的来说就是这里不需要对key进行排序,为了提高效率,选择unordered_map,将魔咒和对应的功能hash到unordered_map中,选择map会获得·一发MLE,最后查询的时候就好查询了。这里我们采用的最简单的字符串hash,has=has*seed+s[i];其中seed我们可以选择31,131,1313,这里我选择131,我们用unsigned long long 存HASH值,因此他会自动取模(2^64-1)。

 

Map和unordered_map区别:

unordered_map和map类似,都是存储的key-value的值,可以通过key快速索引到value。不同的是unordered_map不会根据key的大小进行排序,

存储时是根据key的hash值判断元素是否相同,即unordered_map内部元素是无序的,而map中的元素是按照二叉搜索树存储,进行中序遍历会得到有序遍历。

所以使用时map的key需要定义operator<。而unordered_map需要定义hash_value函数并且重载operator==。但是很多系统内置的数据类型都自带这些,

那么如果是自定义类型,那么就需要自己重载operator<或者hash_value()了。

结论:如果需要内部元素自动排序,使用map,不需要排序使用unordered_map

AC代码:

#include
using namespace std;
const int maxn=1e2+10;
const int seed=131;
typedef unsigned long long ULL;
unordered_mapmpa,mpb;
char str[maxn],sa[maxn],sb[maxn],sc[maxn];
ULL Get_Hash(char s[],int len)
{
    ULL ans=0;
    for(int i=0;i

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(HDU)