The SetStack Computer UVA - 12096
问题
代码
// 算法竞赛入门经典系列源码解析
// 算法竞赛入门经典第2版 p116
// 算法竞赛入门经典 习题与解答
// 算法竞赛入门经典 训练指南
// 算法竞赛入门经典 算法实现
/*
Dreams never shine!
It's you that shine while chasing your dreams :)
JAYO!!
*/
#include <iostream>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <stack>
using namespace std;
typedef set<int> Set;
map<Set, int> IDcache; // 把集合映射成ID
vector<Set> Setcache; // 根据ID取集合
// 查找给定集合x的ID。如果找不到,分配一个新ID
int ID (Set x) {
if(IDcache.count(x)) return IDcache[x];
Setcache.push_back(x); // 添加新集合
return IDcache[x] = Setcache.size() - 1; // 用下表作为ID
}
#define ALL(x) x.begin(), x.end()
#define INS(x) inserter(x, x.begin())
int main()
{
int T;
cin >> T;
while(T--) {
stack<int> s; // 题目中的栈
int n;
cin >> 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 = Setcache[s.top()]; s.pop();
Set x2 = Setcache[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));
}
cout << Setcache[s.top()].size() << endl;
}
cout << "***" << endl;
}
return 0;
}
总结
比赛!!
Codeforces!!!