HDU1880 魔咒词典(字符串哈希)
Description
哈利波特在魔法学校的必修课之一就是学习魔咒。据说魔法世界有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?
题意
给一个字典,来实现查询的功能。将读入的字符串进行哈希处理,然后存入结构体进行排序,最后再二分查找,输出想要查找的字符串。若查找不到,则输出what?。
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<stack>
#include<vector>
#include<algorithm>
#include<functional>
#include<map>
#include<unordered_map>
#define lowbit(x) ((x)&-(x));
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e5+10,NN=2e3+10,INF=0x3f3f3f3f;
const ll MOD=1e9+7;
const ull seed=31;
int sum,q;
char str1[N][30],str2[N][90],cnt[100];
struct Node{
ull num;
int id;
bool friend operator<(const Node &a,const Node &b){
return a.num<b.num;
}
}Hash1[N],Hash2[N],temp;
ull Hashstr(char *str){
ull key=0;
while(*str) key=key*seed+(*str++);
return key;
}
void init(){
sum=0;
}
int main(){
init();
while(~scanf("%s",str1[++sum])){
if(str1[sum][0]=='@'){
--sum;
break;
}
getchar();
gets(str2[sum]);
ull key;
key=Hashstr(str1[sum]);
Hash1[sum].num=key;
Hash1[sum].id=sum;
key=Hashstr(str2[sum]);
Hash2[sum].num=key;
Hash2[sum].id=sum;
}
sort(Hash1+1,Hash1+sum+1);
sort(Hash2+1,Hash2+sum+1);
scanf("%d",&q);
getchar();
while(q--){
gets(cnt);
if(cnt[0]=='['){
ull key=Hashstr(cnt);
temp.num=key;
int n=lower_bound(Hash1+1,Hash1+sum+1,temp)-Hash1;
if(Hash1[n].num==key) printf("%s\n",str2[Hash1[n].id]);
else printf("what?\n");
}
else{
ull key=Hashstr(cnt);
temp.num=key;
int n=lower_bound(Hash2+1,Hash2+sum+1,temp)-Hash2;
if(Hash2[n].num==key){
int len=strlen(str1[Hash2[n].id]);
for(int i=1;i<=len-2;i++) printf("%c",str1[Hash2[n].id][i]);
puts("");
}
else printf("what?\n");
}
}
}