2019-05-09 团体程序设计天梯赛-练习集 L2-002
/*
****************本题大致思路:*****************
首先是数据存储,用map存 第一个数据(string)是键 2,3数据(class)是值
然后遍历这个“链表”
对于每个链表的数据,首先看此数据之前出现过没(绝对值一样就算出现过),出现过就添加到vector中,
没有就把绝对值添加到set中(此set就能看出哪个数据出现过),并且输出
最后遍历输出vector
*/
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<string>
#include<algorithm>
#define iIN(L,R) for(int i=L;i<R;i++)
using namespace std;
class Data
{
public:
int num;
string next;
Data(){} //这个构造函数必须有
Data(int n1,string n2){
num=n1;
next=n2;
}
void operator=(Data d){
this->num=d.num;
this->next=d.next;
}
};
map<string,Data> M;//核心数据结构
vector<string> vec;
vector<int> vec2;//两个vector 装题目中所说的被删除的链表
set<int> S; //装第一次出现的num的绝对值
int main()
{
string now;
int N;
string key;
int num;
string snum;
string next;
Data box;
stringstream water;
cin>>now>>N;
iIN(0,N){
cin>>key>>num>>next;
Data *d=new Data(num,next);
M[key]=*d;
}
int mark=0;
while(1){
if(now=="-1")
{
cout<<" "<<-1<<endl;
break;
}
box=M[now];
num=box.num;
next=box.next;
if(S.count(abs(num))==0){ //第一次出现
if(mark){ //控制输出格式
cout<<" "<<now<<endl<<now<<" "<<num;
}
else
{
mark=1;
if(now!="-1")
cout<<now<<" "<<num;
}
S.insert(abs(num));
}
else{ //非第一次
vec.push_back(now);
vec2.push_back(num);
}
now=next;
}
mark=0;
iIN(0,vec.size()){
if(mark){
cout<<" "<<vec[i]<<endl<<vec[i]<<" "<<vec2[i];
}
else{
mark=1;
cout<<vec[i]<<" "<<vec2[i];
}
}
if(vec.size()>0)
cout<<" "<<-1<<endl;
return 0;
}