UVA12096 集合棧計算機 The SetStack Computer

題目:https://www.luogu.org/problem/UVA12096
這個是各類集合的介紹:https://blog.csdn.net/KnightOnHourse/article/details/80106117
這個是插入迭代器的介紹:https://blog.csdn.net/m0_37456764/article/details/83019250
注意:inserter等迭代器會返回一個迭代器
這道題剩下的就是模擬了,不難

#include<iostream>
#include<cstdio>
#include<set>
#include<stack>
#include<algorithm>
#include<string>
#include<map>
#include<vector>
using namespace std;
string ss;
map<set<int>,int>ma;
vector<set<int> >v;
int t,n;
int getid(set<int>se1)
{
	if(ma.count(se1))return ma[se1];
	v.push_back(se1);
	return ma[se1]=v.size()-1;
}
int main()
{
	freopen("123.txt","w",stdout);
	ios::sync_with_stdio(false);
	cin>>t;
	while(t--)
	{
		v.clear();
		ma.clear();
		stack<int>st;
		while(!st.empty())st.pop();
		cin>>n;
		for(int i=1;i<=n;i++)
		{
			cin>>ss;
			if(ss=="PUSH")
			{
				set<int>se;
				se.clear();
				st.push(getid(se));
			}
			else if(ss=="DUP")
			{
				st.push(st.top());
			}
			else if(ss=="UNION")
			{
			    set<int>se;
				se.clear();
				set<int>se1;
				set<int>se2;
				se1.clear();
				se2.clear();
				se1=v[st.top()];
				st.pop();
				se2=v[st.top()];
				st.pop();
				set_union(se1.begin(),se1.end(),se2.begin(),se2.end(),inserter(se,se.begin()));
				st.push(getid(se));
			}
			else if(ss=="INTERSECT")
			{
				set<int>se;
				se.clear();
				set<int>se1;
				set<int>se2;
				se1.clear();
				se2.clear();
				se1=v[st.top()];
				st.pop();
				se2=v[st.top()];
				st.pop();
				set_intersection(se1.begin(),se1.end(),se2.begin(),se2.end(),inserter(se,se.begin()));
				st.push(getid(se));
			}
			else if(ss=="ADD")
			{
				set<int>se;
				se.clear();
				set<int>se1;
				set<int>se2;
				se1.clear();
				se2.clear();
				se1=v[st.top()];
				st.pop();
				se2=v[st.top()];
				st.pop();
				se2.insert(getid(se1));
				st.push(getid(se2));
			}
			cout<<v[st.top()].size()<<endl;
		}
		cout<<"***"<<endl;
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章