记录编号 551848 评测结果 AAAAAAAAAA
题目名称 [省常中] 集合堆栈电脑 最终得分 100
用户昵称 Gravatar夜莺 是否通过 通过
代码语言 C++ 运行时间 1.783 s
提交时间 2020-07-03 21:24:38 内存使用 13.66 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<string>
#include<set>
#include<map>
#include<stack>
#include<vector>
#include<algorithm>
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
using namespace std;
typedef set<int> Set;
map<Set,int> idh;
vector<Set> seth;
int id(Set x){
	if(idh.count(x))return idh[x];
	seth.push_back(x);
	return idh[x]=seth.size()-1;
}
int main(){
	stack<int> s;
	int n;
	freopen("stacka.in","r",stdin);
	freopen("stacka.out","w",stdout);
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		string op;
		cin>>op;
		if(op[0]=='P')s.push(id(Set()));
		else if(op[0]=='D')s.push(s.top());
		else{
			Set x1=seth[s.top()];s.pop();
			Set x2=seth[s.top()];s.pop();
			Set x;
			if(op[0]=='U')set_union(ALL(x1),ALL(x2),INS(x));
			if(op[0]=='I')set_intersection(ALL(x1),ALL(x2),INS(x));
			if(op[0]=='A'){x=x2;x.insert(id(x1));}
			s.push(id(x));
		}
		printf("%d\n",seth[s.top()].size());
	}
}