100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 程序设计思维与实践 Week15 作业A - ZJM 与霍格沃兹

程序设计思维与实践 Week15 作业A - ZJM 与霍格沃兹

时间:2018-10-04 00:19:51

相关推荐

程序设计思维与实践 Week15 作业A - ZJM 与霍格沃兹

题意:

ZJM 为了准备霍格沃兹的期末考试,决心背魔咒词典,一举拿下咒语翻译题

题库格式:[魔咒] 对应功能

背完题库后,ZJM 开始刷题,现共有 N 道题,每道题给出一个字符串,可能是 [魔咒],也可能是对应功能

ZJM 需要识别这个题目给出的是 [魔咒] 还是对应功能,并写出转换的结果,如果在魔咒词典里找不到,输出 “what?”。

input:

首先列出魔咒词典中不超过100000条不同的咒语,每条格式为:

[魔咒] 对应功能

其中“魔咒”和“对应功能”分别为长度不超过20和80的字符串,字符串中保证不包含字符“[”和“]”,且“]”和后面的字符串之间有且仅有一个空格。魔咒词典最后一行以“@END@”结束,这一行不属于词典中的词条。

词典之后的一行包含正整数N(<=1000),随后是N个测试用例。每个测试用例占一行,或者给出“[魔咒]”,或者给出“对应功能”。

output:

每个测试用例的输出占一行,输出魔咒对应的功能,或者功能对应的魔咒。如果在词典中查不到,就输出“what?”

思路:

因为前面的咒语有【】,单独处理不方便,故直接将整体进行编码存放起来,最后输出的时候再进行处理。用getline,每次读取一行,然后将前面的咒语存到vector中,后面的功能也存放到vector中。然后通过编码将每个字符串都进行编码并于当前的字符串个数存放到map中,直到读到@END@,退出循环。后面找字符串的时候,直接getline读取一行,然后判断有没有【】,如果有,则是找对应的功能,即从map中找到对应的索引然后+1,即得到功能的索引,直接输出即可。如果没有【】,则是找咒语,即找到map中对应的索引,然后减1,得到咒语,输出的时候去掉前后的【】,即可。如果find没找到,则直接输出what?。

代码:

#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <cmath>#include <map>#include <vector>using namespace std;vector<string> a;int tot = 0;char c;map <long long, int> m;const int inf = 1e9;long long f(string x) {long tmp = 0;for (int i = 0; i < x.length(); i++) {tmp=(tmp+(long long)(x[i])*7)%inf;tmp=tmp*7%inf; }return tmp;}string s;int main() {string t1,t2;while (1) {getline(cin, s);if(s == "@END@")break;t1 = s.substr(0, s.find("] ")+1);t2 = s.substr(s.find("] ")+2, s.length() - s.find("] ") - 1);a.push_back(t1);a.push_back(t2);m.insert({f(t1), tot++});m.insert({f(t2), tot++});}int N;cin >> N;getline(cin, s);while (N--) {getline(cin, s);if(m.find(f(s))!=m.end()){if(s[0]=='['){string t=a[m[f(s)]+1];cout<<t<<endl;}else{string t=a[m[f(s)]-1];cout<<t.substr(1,t.length()-2)<<endl;}}else{cout<<"what?"<<endl;}}return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。