标签:style http color os io for ar amp line
题目链接:uva 12096 - The SetStack Computer
题目大意:一个栈,有5种操作;
每次操作后输出栈定集合中元素的个数。
解题思路:将所有集合映射成一个值,用map记录,然后模拟操作即可。
#include <cstdio>
#include <cstring>
#include <set>
#include <map>
#include <stack>
#include <algorithm>
using namespace std;
typedef set<int> sint;
typedef set<int>::iterator iter;
int hn;
stack<sint> stak;
map<sint, int> g;
void hashadd (sint u) {
if (g.count(u))
return;
g[u] = hn++;
}
void putsize () {
if (stak.empty())
return;
printf("%d\n", (int)stak.top().size());
}
void sf_push () {
sint u;
hashadd(u);
stak.push(u);
}
void sf_dup () {
sint u = stak.top();
stak.push(u);
}
void sf_union () {
sint f = stak.top();
stak.pop();
sint u = stak.top();
stak.pop();
for (iter i = f.begin(); i != f.end(); i++)
u.insert(*i);
hashadd(u);
stak.push(u);
}
void sf_inct () {
sint u;
sint f = stak.top();
stak.pop();
sint s = stak.top();
stak.pop();
for (iter i = f.begin(); i != f.end(); i++) {
if (s.count(*i))
u.insert(*i);
}
hashadd(u);
stak.push(u);
}
void sf_add () {
sint f = stak.top();
stak.pop();
sint s = stak.top();
stak.pop();
s.insert(g[f]);
hashadd(s);
stak.push(s);
}
void solve () {
char order[10];
scanf("%s", order);
switch (order[0]) {
case ‘P‘:
sf_push();
break;
case ‘D‘:
sf_dup();
break;
case ‘U‘:
sf_union();
break;
case ‘I‘:
sf_inct();
break;
case ‘A‘:
sf_add();
break;
}
putsize();
}
int main () {
int cas, n;
scanf("%d", &cas);
while (cas--) {
hn = 0;
g.clear();
while (!stak.empty())
stak.pop();
scanf("%d", &n);
while (n--)
solve();
printf("***\n");
}
return 0;
}
uva 12096 - The SetStack Computer(STL)
标签:style http color os io for ar amp line
原文地址:http://blog.csdn.net/keshuai19940722/article/details/38784961