题目1029:魔咒词典
时间限制:5 秒
内存限制:32 兆
特殊判题:否
提交:5483
解决:1584
-
题目描述:
-
哈利波特在魔法学校的必修课之一就是学习魔咒。据说魔法世界有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?
-
答疑:
- 解题遇到问题?分享解题心得?讨论本题请访问: http://t.jobdu.com/thread-7753-1-1.html
-
- 思路:我的思路就是建立有二个字符串的结构体数组,分别存放的是对[魔咒]进行按字母排序,和对对应功能进行按字母排序,然后对要查找的字符串首字母进行判断,如果是小于m(也即是第13个字母),则从前向后搜索,否则从后向前搜索。
-
#include<iostream> #include<string> #include<algorithm> #include<fstream> using namespace std; struct Node { string str1; string str2; }node[100001],node_temp[100001]; bool cmp(const Node &a,const Node &b)//对[魔咒]进行按字母排序 { return a.str1.compare(b.str1)<0; } bool cmp1(const Node &a,const Node &b)//对对应功能进行按字母排序 { return a.str2.compare(b.str2)<0; } int main() { ifstream in; in.open("1.txt"); string str; int index=0; int n; getline(in,str); while(str!="@END@") { int i; for(i=1;i<str.length();++i) { if(str[i]==']') { n=i; break; } } node[index].str1=str.substr(0,n+1); node[index].str2=str.substr(n+2,str.length()); node_temp[index].str1=node[index].str1; node_temp[index].str2=node[index].str2; ++index; getline(in,str); } sort(node,node+index,cmp); sort(node_temp,node_temp+index,cmp1); int num; in>>num; in.get();//读取整数之后留下的回车字符 for(int i=0;i<num;++i) { getline(in,str); if(str[0]=='[') { if(str[1]<='m') { int j; for(j=0;j<index;++j) { if(str.compare(node[j].str1)==0) { cout<<node[j].str2<<endl; break; } } if(j==index) cout<<"what?"<<endl; } else { int j; for(j=index-1;j>=0;--j) { if(str.compare(node[j].str1)==0) { cout<<node[j].str2<<endl; break; } } if(j==-1) cout<<"what?"<<endl; } } else if(str[0]<='m'&& str[0]>='a') { int j; for(j=0;j<index;++j) { if(str.compare(node_temp[j].str2)==0) { for(int k=1;k<node_temp[j].str1.length()-1;++k) cout<<node_temp[j].str1[k]; cout<<endl; break; } } if(j==index) cout<<"what?"<<endl; } else { int j; for(j=index-1;j>=0;--j) { if(str.compare(node_temp[j].str2)==0) { for(int k=1;k<node_temp[j].str1.length()-1;++k) cout<<node_temp[j].str1[k]; cout<<endl; break; } } if(j==-1) cout<<"what?"<<endl; } } return 0; }
- (2)map的应用
-
#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; }