难度:3
整整写了45分钟,这道题思路想清楚就行了,这道题用了3个vector,第一个就是书架,借书就是从v1拿到了v2,return就是准备还书了,也就是从v2里面拿到v3里面准备还书,第三个操作就是还书,将v3里面的放回v1里面,这三种操作都不要忘了将以前的删除,还书之前也要排序一下,最后的end的输出也要注意一下,借书还书两个指令的操作鞋得一模一样,但是也没有写成函数。
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pa;
struct book {
string name, author;
book() {}
book(string a, string b): name(a), author(b) {}
};
bool cmp(book a, book b) {
if (a.author != b.author) return a.author < b.author;
else return a.name < b.name;
}
int main() {
string s;
vector<book> v1;
while (getline(cin, s) && s != "END") {
int p = s.find("by");
v1.pb(book(s.substr(1, p - 3), s.substr(p + 3, (int) s.size() - p - 4)));
}
sort(all(v1), cmp);
vector<book> v2, v3;
while (getline(cin, s) && s != "END") {
string temp;
if (s[0] == 'B') {
int p = s.find(" ");
temp = s.substr(p + 2, (int) s.size() - p - 3);
for (int i = 0; i < (int) v1.size(); i++) {
if (v1[i].name == temp) {
v2.pb(v1[i]);
v1.erase(v1.begin() + i);
break;
}
}
} else if (s[0] == 'R') {
int p = s.find(" ");
temp = s.substr(p + 2, (int) s.size() - p - 3);
for (int i = 0; i < (int) v2.size(); i++) {
if (v2[i].name == temp) {
v3.pb(v2[i]);
v2.erase(v2.begin() + i);
break;
}
}
} else {
sort(all(v3), cmp);
for (int i = 0; i < (int) v3.size(); i++) {
v1.pb(v3[i]);
}
sort(all(v1), cmp);
for (int i = 0; i < (int) v3.size(); i++) {
for (int j = 0; j < (int) v1.size(); j++) {
if (v3[i].name == v1[j].name) {
if (j == 0) printf("Put \"%s\" first\n", v1[j].name.c_str());
else printf("Put \"%s\" after \"%s\"\n", v1[j].name.c_str(), v1[j - 1].name.c_str());
break;
}
}
}
v3.clear();
cout << "END" << endl;
}
}
return 0;
}