采用数据结构与大概流程
1.采用stack<int>
模拟栈的操作
2.采用vector<Set>
保存所有的set<int>
3.采用map<Set,int>
保存每个Set对应的int值
findNum函数用来寻找map中是否有Set值,如果有则返回这个值,如果没有则根据vector的长度新分配一个
空集用Set()生成,对应ID为1
如{{},{{}},{{{}}}}
这种复杂的集合的集合形式可以化简为{1,2,3},同时给{1,2,3}一个ID:4
这题中还使用了STL的并集和差集 运算
inserter(x,x.begin()) 插入型迭代器,可见
【STL】插入型迭代器(Insert Iterator)或插入器(inserter)
并集:set_union(a.begin(),a.end(),b.begin(),b.end(),inserter(x,x.begin()))
交集:set_intersection(a.begin(),a.end(),b.begin(),b.end(),inserter(x,x.begin()))
代码实现
#include<iostream>
#include<stack>
#include<map>
#include<vector>
#include<string>
#include<set>
#include<algorithm>
#include<iterator>
using namespace std;
typedef set<int> Set;
stack<int> result; //栈的操作
map<Set, int> savedSet; //保存每个 set和对应的序号值
vector<Set> AllSet; //保存当前所有的集合
#define range(x) x.begin(),x.end()
#define dest(x) inserter(x,x.begin())
//查找集合,看在map中是否存在
int findNum(Set x)
{
if (!savedSet.count(x))
{
AllSet.push_back(x);
return savedSet[x] = AllSet.size() - 1;
}
else
return savedSet[x];
}
int main()
{
int T,n;
string order;
cin >> T;
for (int i = 0; i < T; i++)
{
cin >> n;
for (int j = 0; j < n; j++)
{
cin >> order;
if(order[0]=='P')
result.push(findNum(Set()));
else if (order[0] == 'D')
result.push(result.top());
else
{
Set top =AllSet[result.top()];
result.pop();
Set topNext = AllSet[result.top()];
result.pop();
Set temp;
if (order[0] == 'U')
{
set_union(range(top),range(topNext),dest(temp));
result.push(findNum(temp));
}
if (order[0] == 'I')
{
set_intersection(range(top), range(topNext), dest(temp));
result.push(findNum(temp));
}
if (order[0] == 'A')
{
topNext.insert(findNum(top));
result.push(findNum(topNext));
}
}
cout << AllSet[result.top()].size() << endl;
}
cout << "***"<<endl;
}
//system("pause");
return 0;
}