第二次END结束之后重新再开始,所有数据清空
#include <cstring>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
using namespace std;
vector<string> book;
vector<string> name;
string x,str=" by ";
map<string,int> dig,dig2;
int n=0;
//计算每个字符串 作者名的位置
int cal_dig(){
for(int i =0; i<x.length(); i++){
if(x[i]==str[0]&&x[i+1]==str[1]&&x[i+2]==str[2]&&x[i+3]==str[3]){
dig[x]=i+4;
return i;
}
}
}
//比较两个题目的先后顺序
int cmp2(const int i,const int j){
for(int k=0 ;;k++){
if(book[i][k]>book[j][k]) return 1;
else if(book[i][k]<book[j][k]) return -1;
}
cout<<"WRONG AT TWO-The two book is the same"<<endl;
exit(EXIT_SUCCESS);
}
//比较两个作者名的先后顺序
int cmp(const int i,const int j){
int k=dig[book[i]];
int t=dig[book[j]];
for(;k<book[i].length()&&t<book[j].length();k++,t++){
if(book[i][k]>book[j][t]) return 1;
else if(book[i][k]<book[j][t]) return -1;
}
if(k==book[i].length()&&t!=book[j].length()) return -1;
if(k!=book[i].length()&&t==book[j].length()) return 1;
if(k!=book[i].length()&&t!=book[j].length()) { cout<<"WRONG AT ONE"<<endl; exit(EXIT_SUCCESS); }
return cmp2(i,j);
}
//交换两个字符串
void ex(int i, int j){
string temp=book[i];
book[i]=book[j];
book[j]=temp;
}
int fin_book(const string x){
for(int i =0;i<n;i++)
if(x==name[i])
return i;
}
void bo_book(int *on){
getline(cin,x);
for(int i = x.length()-1;i>=0;i--){
if(x[i]=='"'){
x=x.substr(1,i); break;
}
}
int i=fin_book(x);
on[i]=0;
//cout<<i<<"bo============="<<endl;
}
void re_book(int *re){
getline(cin,x);
for(int i = x.length()-1;i>=0;i--){
if(x[i]=='"'){
x=x.substr(1,i); break;
}
}
int i=fin_book(x);
re[i]=-1;
//cout<<i<<"re==========="<<endl;
}
void sh_book(int *on,int *re){
for(int i=0;i<n;i++){
if(re[i]==-1){
on[i]=-1;
re[i]=0;
int j,before=-1;
for(j=i-1; j>=0; j--)
if(on[j]==-1){ before=j;break;}
if(before>=0){
cout<<"Put "<<name[i]<<" after "<<name[j]<<endl;
}
else cout<<"Put "<<name[i]<<" first"<<endl;
}
}
cout<<"END"<<endl;
}
int main(){
//freopen("in.txt","r",stdin);
start:
n=0;
book.clear();
name.clear();
dig=dig2;
while(getline(cin,x)){
if(x[0]=='E') break;
book.push_back(x);
n++;
cal_dig();
}
if(n==0) return 0;
int on[n],re[n];
//-1 on , 0 borrow;
//0 no, -1 re;
memset(on,-1,sizeof(on));
memset(re, 0,sizeof(re));
//排序
for(int i=0; i<n-1; i++){
for(int j=i+1; j<n; j++){
if(cmp(i,j)==1)
ex(i,j);
}
}
for(int i =0; i<n; i++){
int len=dig[book[i]]-4;
name.push_back(book[i].substr(0,len));
}
while(cin>>x){
if(x[0]=='B')
bo_book(on);
if(x[0]=='R')
re_book(re);
if(x[0]=='S')
sh_book(on,re);
if(x[0]=='E')
goto start;
}
return 0;
}