浙大机试2008:魔咒词典

http://acm.hdu.edu.cn/showproblem.php?pid=1880

Problem 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?


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXN 100000
typedef struct{
	char zy[25]; //神坑:[21]一直WA,浪费我好几小时
	char fun[85];//[81]也一直WA
}ZY;
ZY zys[MAXN];
ZY zys2[MAXN];
int cmp1(const ZY* a,const ZY* b){
	return strcmp((*a).zy,(*b).zy);
}
int cmp2(const ZY* a,const ZY* b){
	return strcmp((*a).fun,(*b).fun);
}
ZY* bsearch1(int low,int high,const ZY *p){
	int mid;
	int ret;
	while(low <= high){
		mid = (low + high) >> 1;
		ret = cmp1(&zys[mid],p);
		if(ret == 0){
			return &zys[mid];
		}
		else if(ret > 0)
			high = mid - 1;
		else low = mid + 1;
	}
	return 0;
}
ZY* bsearch2(int low,int high,const ZY *p){
	int mid;
	int ret;
	while(low <= high){
		mid = (low + high) >> 1;
		ret = cmp2(&zys2[mid],p);
		if(ret == 0){
			return &zys2[mid];
		}
		else if(ret > 0)
			high = mid - 1;
		else low = mid + 1;
	}
	return 0;
}
int main(){
	char test[81];
	char *end = "@END@";
	int i = 0,j = 0,n,cnt,len;
	char ch;
	ZY _zy;
	ZY *_zy1;
	while(1){
		j = 0;
		while(']' != (ch = getchar()) && '@' != ch)
			zys[i].zy[j++] = ch;
		if(ch == '@'){
			gets(test);
			break;
		}
		zys[i].zy[j++] = ']';
		zys[i].zy[j++] = 0;
		getchar();
		j = 0;
		gets(zys[i].fun);
		strcpy(zys2[i].zy,zys[i].zy);
		strcpy(zys2[i].fun,zys[i].fun);
		i++;
	}
	cnt = i;
	qsort(zys,i,sizeof(ZY),cmp1);
	qsort(zys2,i,sizeof(ZY),cmp2);
	scanf("%d",&n);
	getchar();
	for(i = 0;i < n;++i){
		j = 0;
		gets(test);
		if(test[0] == '['){
			strcpy(_zy.zy,test);
			_zy1 = bsearch1(0,cnt-1,&_zy);
			if(_zy1)
				printf("%s\n",_zy1->fun);
			else
				printf("what?\n");
		}
		else{
			strcpy(_zy.fun,test);
			_zy1 = bsearch2(0,cnt-1,&_zy);
			if(_zy1){
				len = strlen(_zy1->zy);
				_zy1->zy[len-1] = 0;
				printf("%s\n",_zy1->zy+1);
			}
			else
				printf("what?\n");
		}
	}
	return 0;
}





你可能感兴趣的:(算法,解题报告,浙大机试,浙大机试2008魔咒词典)