2019-05-09 团体程序设计天梯赛-练习集 L2-002

2019-05-09  本文已影响0人  快意江湖

/*

****************本题大致思路:*****************

首先是数据存储,用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;

}

上一篇下一篇

猜你喜欢

热点阅读