Description
给出一棵树先序遍历时访问点的顺序,要求还原这棵树
Input
第一行一整数n表示树的点数,之后2*n行每行输入in u或out u,in u表示刚搜到u,out u表示搜完u(1<=n<=1e5)
Output
输出n-1个点对表示这棵树上的n-1条边
Sample Input
2
in 1
in 2
out 2
out 1
Sample Output
1 2
Solution
把点一个个扔栈里,如果当前点与栈顶元素不相同说明栈顶元素是该点的父亲节点,记录该条边然后将该点入栈,如果当前点与栈顶元素,这样以来所有叶子节点就会被拿走,倒数第二层就变成叶子节点,一层层将所有点拿完即得到所有的边
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define maxn 111111
typedef pair<int,int>P;
vector<P>ans;
int n,a[maxn],cnt;
char op[4];
int main()
{
while(~scanf("%d",&n))
{
ans.clear();
int res=0;
for(int i=1;i<=2*n;i++)
{
int u;
scanf("%s%d",op,&u);
if(!res)a[++res]=u;
else if(a[res]!=u)ans.push_back(P(a[res],u)),a[++res]=u;
else if(a[res]==u)res--;
}
for(int i=0;i<n-1;i++)printf("%d %d\n",ans[i].first,ans[i].second);
}
return 0;
}