HDU1880 魔咒词典(字符串哈希+二分)

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
#include
#include
#include
#include
#include
#include
#include
#include
#include 
#include
#include
#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");
		}
	}
}

你可能感兴趣的:(字符串哈希,二分)