/*
幼儿园两个班的小朋友排队时混在了一起
每个小朋友都知道自己跟前面一个小朋友是不是同班
请你帮忙把同班的小朋友找出来
小朋友的编号为整数
与前面一个小朋友同班用Y表示
不同班用N表示
输入描述:
输入为空格分开的小朋友编号和是否同班标志
比如 16/N 12/Y 13/N 14/Y
表示一共有4位小朋友
12和16是同班 13和12不同班 14和13同班
小朋友总数不超过999
0< 每个小朋友编号 <999
不考虑输入格式错误
输出两行
每一行记录一班小朋友的编号 编号用空格分开
并且
1. 编号需要按照大小升序排列,分班记录中第一个编号小的排在第一行
2. 如果只有一个班的小朋友 第二行为空
3. 如果输入不符合要求输出字符串ERROR
示例:
输入
16/N 12/Y 13/N 14/Y
输出(按编号大小排列)
12 16
13 14
说明:12的同班标记为Y因此和16同班
13的同班标记位N因此和16,12不同班
14的同班标记位Y因此和13同班
*/
#include <regex>
#include <vector>
#include <iostream>
#include <string>
#include <set>
#include <sstream>
using namespace std;
struct ST
{
string id;
bool clss; //只有两个班级 不是1就是0
};
vector<pair<string, string>> v;
vector<ST> vs;
multiset<int> s1, s0; //1班的成员编号,0班的成员编号,set自动排序
int main()
{
string str;
regex reg("(\\d+)/([NY]{1})");
while (cin >> str)
{
smatch result;
if (regex_match(str, result, reg))
{
v.push_back(make_pair(result[1], result[2]));
//result[i]是正则表达式中第i个括号中匹配到的内容
}
else
{
cout << "ERROR!";
return 0;
}
}
//默认第一个小孩是1班的 , 后面输出的时候也要先输出1班的
ST st;
st.id = v[0].first;
st.clss = 1;
vs.push_back(st);
for (int i = 1; i < v.size(); i++)
{
st.id = v[i].first;
if (v[i].second == "Y") //和前面的成员是同班的
st.clss = vs[i - 1].clss; //等于前面成员的班级
else //不同班,前一个成员班级取反 。只有两个班级 非0即1
st.clss = !vs[i - 1].clss; //bool值取反 加'!'
vs.push_back(st);
}
stringstream ss; int tmp;
for (int i = 0; i < vs.size(); i++) //1班的人员编号入s1
//cout << vs[i].bianhao << ':' << vs[i].banji << endl;
{
ss.clear();
ss << vs[i].id;
ss >> tmp; //string型转成int 入set排序
if (vs[i].clss == 1)
s1.insert(tmp);
if (vs[i].clss == 0)
s0.insert(tmp);
}
auto itr1 = s1.begin(), itr0 = s0.begin();
while (itr1 != s1.end()) //先输出1班的成员id
{
cout << *itr1 << ' ';
++itr1;
}
cout << endl;
while (itr0 != s0.end()) //再输出0班的成员id
{
cout << *itr0 << ' ';
++itr0;
}
return 0;
}