1886

来源:互联网 发布:IT界伍飞宇 编辑:程序博客网 时间:2024/06/05 00:59
#include <cstdio>#include <iostream>#include <string>#include <vector>#include <algorithm>using namespace std;struct book{book(const char *a, const char *n): author(a), name(n), status(0){};string author;string name;int status;friend bool operator < (const book &left, const book &right);};inline bool operator < (const book &left, const book &right){const int tmp = left.author.compare(right.author);if(tmp != 0){return (-1 == tmp)? true: false;}return (-1 == left.name.compare(right.name))? true: false;}vector<book> lib;vector<int> find_by_name;void input(){char tmp[256];for(cin.getline(tmp, sizeof(tmp)); strcmp(tmp, "END") != 0; cin.getline(tmp, sizeof(tmp))){char author[100], name[100];sscanf(tmp, "\"%[^\"]\" by %[ a-zA-Z.,]", name, author);lib.push_back(book(author, name));}}bool judge(const int left, const int right){return (-1 == lib[left].name.compare(lib[right].name))? true: false;}int bsearch(const string &value){int left = 0, right = find_by_name.size();for(int mid = (left + right) / 2; left < right; mid = (left + right) / 2){if(lib[find_by_name[mid]].name < value){left = mid + 1;}else{right = mid;}}return left;}void deal(){char tmp[256];string value;char name[100];int pos;for(cin.getline(tmp, sizeof(tmp)); strcmp(tmp, "END") != 0; cin.getline(tmp, sizeof(tmp))){switch(tmp[0]){case 'B':sscanf(tmp + 8, "%[^\"]", name);value.assign(name);pos = bsearch(value);lib[find_by_name[pos]].status = 1;break;case 'R':sscanf(tmp + 8, "%[^\"]", name);value.assign(name);pos = bsearch(value);lib[find_by_name[pos]].status = 2;break;case 'S':for(int i = 0; i < lib.size(); ++i){if(2 == lib[i].status){int j = i - 1;for(; j >= 0; --j){if(0 == lib[j].status){break;}}lib[i].status = 0;if(j >= 0){printf("Put \"%s\" after \"%s\"\n", lib[i].name.c_str(), lib[j].name.c_str());}else{printf("Put \"%s\" first\n", lib[i].name.c_str());}}}printf("END\n");}}}int main(){input();sort(lib.begin(), lib.end());for(int i = 0; i < lib.size(); ++i){find_by_name.push_back(i);}sort(find_by_name.begin(), find_by_name.end(), judge);deal();return 0;}