魔咒词典 HDU - 1880

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

Input

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

Sample Input

[expelliarmus] the disarming charm
[rictusempra] send a jet of silver light to hit the enemy
[tarantallegra] control the movement of one's legs
[serpensortia] shoot a snake out of the end of one's wand
[lumos] light the wand
[obliviate] the memory charm
[expecto patronum] send a Patronus to the dementors
[accio] the summoning charm
@END@
4
[lumos]
the summoning charm
[arha]
take me to the sky

Sample Output

light the wand
accio
what?
what?
 1 #include<unordered_map>//别忘了加头文件 
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<iostream>
 5 #include<cstring>
 6 #include<string>
 7 using namespace std;
 8 typedef long long int ll;
 9 typedef unsigned long  int ull;
10 const int maxn = 110;
11 string str;
12 unordered_map<ull, string>mp1, mp2;//用map可能会超时 
13 int n, ans = 1;
14 ull hash1(string s)
15 {
16     int len = s.length();
17     ull ans = 0;
18     for (int i = 0;i < len;i++)
19         ans = (ans * 131 + (ull)s[i]);
20     return ans;
21 }
22 int main() {
23     while (1) {
24         getline(cin, str);
25         if (str[0] == '@')break;
26         int len = str.length();
27         string a, b;
28         int cnt = 0;
29         for(int i=1;i<=len-1;++i)  {
30             if (str[i] == ']') {
31                 cnt = i;
32                 break;
33             }
34             a += str[i];//读入咒语 
35         }
36         for(int i=cnt+2;i<=len-1;++i) {
37             b += str[i];//读入功能 
38         }
39         ull val1 = hash1(a);//val1咒语的hash值 
40         ull val2 = hash1(b);//val2功能的hash值 
41         mp1[val1] = b;//存入咒语对应的功能 
42         mp2[val2] = a;//存入功能对应的咒语 
43     }
44     int n;
45     scanf("%d",&n);
46     getchar();
47     while (n--) {
48         getline(cin, str);
49         if (str[0] == '[') {//判断是否为咒语 
50             string a;
51             int len = str.length();
52             for(int i=1;i<=len-2;++i){
53                 a += str[i];
54             }
55             ull index = hash1(a);
56             if (mp1.count(index)) {//判断是否出现 
57                 cout << mp1[index] << endl;//找到输出功能 
58             }
59             else puts("what?");
60         }
61         else {
62             string a = str;
63             ull index = hash1(a);
64             if (mp2.count(index)) {//判断是否出现 
65                 cout << mp2[index] << endl;//找到输出咒语 
66             }
67             else puts("what?");
68         }
69     }
70 }

 

posted @ 2020-07-24 10:20  programmer_w  阅读(157)  评论(0编辑  收藏  举报