这题主要相通几个点就行
首先是 存书和人名 ,然后分割字符串呢?
提示 中 书没有双引号 所以可以通过计算双引号的个数来确定书名,
而人名 不就在 ”by“ 之后吗 ,那么判断 出现”by“ 不就好了? 不行,因为书名中可能出现by !
所以再加个双引号个数为2的条件,就独一无二!
接下来是模拟管理,书名不同,我们可以用一个 map 储存书的状态 ! 当然,排序是必不可少的
然后对于 每次 的 输出
first 只需标记是否已有就行 , 然后不是第一本 每次顺便存个前面那本书不就好了? 注意你存进去之后状态得改
没啥了吧
上代码
#include <bits/stdc++.h>
using namespace std;
struct stu{
string name;
string book;
bool operator < (const stu b) const
{
if(this->name == b.name) return this->book < b.book;
return this->name < b.name;
}
}q;
vector <stu> jia;
map<string,int> f; // 1 为存着 -1 借出 0 窝着等待拯救
int main()
{
string s,ss;
while(getline(cin,s))
{
if(s=="END") break;
int n = s.size(),yin = 0;
for (int i = 0; i < n ; i++)
{
if(s[i]=='"') yin++;
if(yin == 2)
{
q.book = s.substr(0,i+1);
yin++; // 保证之进来一次
}
if(s.substr(i,2) == "by" && yin >= 2)
{
q.name = s.substr(i+3,n-i-3);
break;
}
}
//cout<<endl<<q.book<<" "<<q.name<<endl;
f[q.book] = 1;
jia.push_back(q);
}
int n = jia.size();
sort(jia.begin(),jia.end());
// 初始化完成
while (getline (cin,s))
{
int len = s.size();
if(s[0]=='B')
{
ss = s.substr(7,len-7);
f[ss] = -1;
}
else if(s[0]=='R')
{
ss = s.substr(7,len-7);
f[ss] = 0;
}
else if(s[0]=='S')
{
int qian = 0,kk = 0;//qian 前面的书 kk表示是否有了第一本
for (int i = 0 ; i < n; i++)
{
ss = jia[i].book;
if(f[ss] == 1 )
{
qian = i; kk = 1;
}
else if(f[ss] == 0)
{
if(!kk)
{
kk = 1; f[ss] = 1; qian = i;
cout<<"Put "<<ss<<" first"<<endl;
}
else
{
f[ss] = 1;
cout<<"Put "<<ss<<" after "<<jia[qian].book<<endl;
qian = i;
}
}
}
cout<<"END"<<endl;
}
else break;
}
return 0;
}