题目1029:魔咒词典
时间限制:5 秒
内存限制:32 兆
特殊判题:否
提交:1956
解决:542
-
题目描述:
-
哈利波特在魔法学校的必修课之一就是学习魔咒。据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮助。
给你一部魔咒词典。当哈利听到一个魔咒时,你的程序必须告诉他那个魔咒的功能;当哈利需要某个功能但不知道该用什么魔咒时,你的程序要替他找到相应的魔咒。如果他要的魔咒不在词典中,就输出“what?”
-
输入:
-
首先列出词典中不超过100000条不同的魔咒词条,每条格式为:
[魔咒] 对应功能
其中“魔咒”和“对应功能”分别为长度不超过20和80的字符串,字符串中保证不包含字符“[”和“]”,且“]”和后面的字符串之间有且仅有一个空格。词典最后一行以“@END@”结束,这一行不属于词典中的词条。
词典之后的一行包含正整数N(<=1000),随后是N个测试用例。每个测试用例占一行,或者给出“[魔咒]”,或者给出“对应功能”。
-
输出:
-
每个测试用例的输出占一行,输出魔咒对应的功能,或者功能对应的魔咒。如果魔咒不在词典中,就输出“what?”
-
样例输入:
-
[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
-
样例输出:
-
light the wand accio what? what?
-
来源:
- 2008年浙江大学计算机及软件工程研究生机试真题
-
转载/********************************* * 日期:2013-2-18 * 作者:SJF0115 * 题号: 九度OJ 题目1029:魔咒词典 * 来源:http://ac.jobdu.com/problem.php?pid=1029 * 结果:AC * 来源:2008年浙江大学计算机及软件工程研究生机试真题 * 总结: **********************************/ #include<map> #include<string> #include<iostream> #include<string.h> #include <stdio.h> using namespace std; map<string,string> Map; int Function(string str){ int len=str.length(); int i; for(i = 0;i < len;i++) { if(str[i]==']') { break; } } //魔咒 string s1 = str.substr(0,i+1); //对应功能 string s2 = str.substr(i+2,len-i-2); //存储在Map中 Map[s1] = s2; Map[s2] = s1; return 0; } int main() { char s[105]; int n,i; string str; //输入数据 while(gets(s)){ str = s; if(str == "@END@") { break; } //分割魔咒及其对应功能 Function(str); } scanf("%d\n",&n); for(i = 0;i < n;i++){ gets(s); str = s; //寻找魔咒或者对应功能 if(Map.find(str) == Map.end()) { printf("what?\n"); } else { str = Map[str]; //输出对应的功能 if(str[0] != '[') { cout<<str<<endl; } //输出对应的魔咒 else { cout<<str.substr(1,str.length()-2)<<endl; } } }//for return 0; }
#include <stdio.h> #include <string.h> #include <stdlib.h> struct dic { char wo[22]; char ex[82]; }a[10000],b[10000]; int cmp1(const void *a,const void *b) { return strcmp((*(struct dic *)a).wo,(*(struct dic *)b).wo); } int cmp2(const void *a,const void *b) { return strcmp((*(struct dic *)a).ex,(*(struct dic *)b).ex); } int main() { int i,k; int n,high,low,mid,tmp,ans; char s[104],c[82]; k=0; while(gets(s)&&strcmp(s,"@END@")) { int j=0; i=1; while(s[i]!=']') { a[k].wo[j]=s[i]; b[k].wo[j]=s[i]; j++; i++; } a[k].wo[j+1]='\0'; b[k].wo[j+1]='\0'; if(s[i]==']') i+=2; j=0; while(s[i]!='\0') { a[k].ex[j]=s[i]; b[k].ex[j]=s[i]; j++; i++; } a[k].ex[j+1]='\0'; b[k].ex[j+1]='\0'; k++; } qsort(a,k,sizeof(a[0]),cmp1); qsort(b,k,sizeof(b[0]),cmp2); scanf("%d",&n); getchar(); while(n--) { gets(c); ans=-1; low=0;high=k-1; if(c[0]=='[') { int len; len=strlen(c); for(i=0;i<len-2;i++) c[i]=c[i+1]; c[i]='\0'; while(low<=high) { mid=(low+high)/2; tmp=strcmp(c,a[mid].wo); if (tmp==0) {ans=mid;break;} else if(tmp>0) low=mid+1; else high=mid-1; } if(ans==-1) printf("what?\n"); else printf("%s\n",a[ans].ex); } else { while(low<=high) { mid=(low+high)/2; tmp=strcmp(c,b[mid].ex); if (tmp==0) {ans=mid;break;} else if(tmp>0) low=mid+1; else high=mid-1; } if(ans==-1) printf("what?\n"); else printf("%s\n",b[ans].wo); } } return 0; }
-
Runtime Error 拜求大牛????????????
#include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct Str{ char name[22];//魔咒 char function[82];//对应功能 }Str; Str str[10001]; int main() { int n,i,j,index = 0,flag,start,k; char s[104]; //char command[104]; while (gets(s)){ //词典最后一行以“@END@”结束,这一行不属于词典中的词条 if(s[0] == '@'){ break; } else{ //输入魔咒 for(i = 0;s[i] != ']';i++){ str[index].name[i] = s[i]; } str[index].name[i++] = ']'; str[index].name[i] = '\0'; //输入对应功能 start = i+1; for(i = start,k = 0;s[i] != '\n';k++,i++){ str[index].function[k] = s[i]; } str[index].function[k] = '\0'; } index++; }//while scanf("%d\n",&n); for(i = 0;i < n;i++){ gets(s); flag = 0; //输入的是魔咒输出对应功能 if(s[0] == '['){ for(j = 0;j < index;j++){ //找到魔咒对应的功能 if(strcmp(s,str[j].name) == 0){ flag = 1; //输出对应的功能 printf("%s\n",str[j].function); break; } } } //输入的是魔咒的功能输出魔咒 else{ for(j = 0;j < index;j++){ //找到对应的魔咒 if(strcmp(s,str[j].function) == 0){ flag = 1; //输出对应的魔咒 for(k = 1;str[j].name[k] != ']';k++){ printf("%c",str[j].name[k]); } printf("\n"); break; } } } //没有找到 if(flag == 0){ printf("what?\n"); } } return 0; }