题目链接:The SetStack Computer - UVA 12096 - Virtual Judge (vjudge.net)
首先就是,我无能,我是废物,我是花好长时间才理解作者的代码的,更别提自己写了,所以我只能在这里分析作者的代码,从中学到些知识:
作者代码:
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string.h>
#include <cstdio>
#include <string>
#include <vector>
#include <bitset>
#include <set>
#include <map>
#include <stack>
#define maxm 30
using namespace std;
int n,k;
stack<int> com;
vector<set<int>> p;//用于集合和对应编号的转换
map<set<int>,int> m;//根据编号取集合
int id(set<int> x)
{
if(m.count(x))
return m[x];
p.push_back(x);
return m[x]=p.size()-1;
}
int main()
{
cin>>n;
while(n--)
{ stack<int> s;
cin>>k;
while(k--)
{
string ss;
cin>>ss;
if(ss[0]=='P')
s.push(id(set<int>()));
else if(ss[0]=='D')
s.push(s.top());
else
{
set<int> x1=p[s.top()];s.pop();
set <int> x2=p[s.top()];s.pop();
set <int> x;
if(ss[0]=='U')
set_union(x1.begin(),x1.end(),x2.begin(),x2.end(),inserter(x,x.begin()));
if(ss[0]=='I')
set_intersection(x1.begin(),x1.end(),x2.begin(),x2.end(),inserter(x,x.begin()));
if(ss[0]=='A')
{
x=x2;
x.insert(id(x1));
}
s.push(id(x));
}
cout<<p[s.top()].size()<<endl;
}
cout<<"***"<<endl;
}
return 0;
}
其中set <int> ()可以表示空集,本题中定义的栈储存的是对应集合的元素个数,注意map可以自动排序。