UVA230 - Borrowers

第二次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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值