UVA12096 - The SetStack Computer(set + map映射)
阿新 • • 發佈:2017-05-07
dex onos keyword ets undefine case uva sans break
UVA12096 - The SetStack Computer(set + map映射)
題目鏈接
題目大意:有五個動作:
push : 把一個空集合{}放到棧頂。
dup : 把棧頂的集合取出來,在入棧兩次。
add : 出棧兩次。把第一個集合作為一個元素放入第二個集合中,再將第二個集合入棧
union: 出棧兩次,取這兩個集合的並集。將結果入棧。
intersect: 出棧兩次。取這兩個集合的交集,將結果入棧。
每次運行動作後還須要輸出眼下棧頂集合的元素個數。
解題思路:這題能夠用棧和set來模擬,push就把空的集合入棧,可是在並集和交集的時候就須要判段集合是否同樣,所以這裏能夠用map把出現過的集合手動的映射成數字。
代碼:
#include <cstdio>
#include <cstring>
#include <stack>
#include <set>
#include <map>
using namespace std;
char op[15];
int n;
typedef set<int> E;
stack<E> s;
map<E, int> vis;
E tmp1, tmp2;
set<int>::iterator it;
int num;
void hash (E a) {
if (!vis.count(a))
vis[a] = ++num;
}
void Push () {
tmp1.clear();
s.push (tmp1);
}
void Dup () {
tmp1 = s.top();
s.push (tmp1);
}
void Add () {
tmp2 = s.top();
s.pop();
tmp1 = s.top();
s.pop();
tmp1.insert (vis[tmp2]);
hash(tmp1);
s.push(tmp1);
}
void Union () {
tmp2 = s.top();
s.pop();
tmp1 = s.top();
s.pop();
for (it = tmp1.begin(); it != tmp1.end(); it++)
tmp2.insert (*it);
hash (tmp2);
s.push (tmp2);
}
void Intersect () {
tmp2 = s.top();
s.pop();
tmp1 = s.top();
s.pop();
E tmp;
for (it = tmp1.begin(); it != tmp1.end(); it++)
if (tmp2.count(*it))
tmp.insert (*it);
hash (tmp);
s.push(tmp);
}
void solve () {
switch (op[0]) {
case ‘P‘ : Push(); break;
case ‘D‘ : Dup(); break;
case ‘U‘ : Union(); break;
case ‘I‘ : Intersect(); break;
case ‘A‘ : Add(); break;
}
printf ("%d\n", s.top().size());
}
void init () {
num = 1;
while (!s.empty()) {
s.pop();
}
vis.clear();
}
int main () {
int T;
scanf ("%d", &T);
while (T--) {
scanf ("%d", &n);
while (n--) {
scanf ("%s", op);
solve();
}
printf ("***\n");
}
return 0;
}
UVA12096 - The SetStack Computer(set + map映射)