題目: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;
}
}