1. 程式人生 > >ssoj1017集合棧(stack+set)

ssoj1017集合棧(stack+set)

【題目】計算機的操作物件是一個以集合為元素的棧,一開始這個棧是空的。在每一步操作之後,棧頂集合中所含元素的個數是需要你輸出的東西。計算機的操作指令有PUSH,DUP,UNION,INTERSECT,ADD。
•PUSH操作將一個空集合{}入棧
•DUP操作將把一個和棧頂元素相同的集合入棧
•UNION操作進行兩次出棧操作,並且把出棧的兩個集合的併入棧
•INTERSECT操作進行兩次出棧操作,並且把出棧的兩個集合的交入棧
•ADD操作進行兩次出棧操作,並且把第一個出棧的集合作為一個元素,放入第二個出棧的集合中,然後把這個結果入棧
舉一個例子,假設棧頂的元素是A={{},{{}}},而它下面的一個元素是B={{},{{{}}}}。
顯然,集合A有2個元素,集合B也是。對於這個情況:
•UNION操作會產生集合{{},{{}},{{{}}}},這個集合有3個元素,所以要輸出3
•INTERSECT操作會產生{{}},所以要輸出1

ADD操作會產生{{},{{{}}},{{},{{}}}},所以要輸出3

【思路】練習stl尤其是set的一個好題。

【程式碼】

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
#include <set>
using namespace std;
const int maxn=2003;
const int mod=100000007;
std::set<int>st,st1,st2;
typedef set<int>::iterator it;
stack<set<int> >s;
int n,cnt=0;
char str[maxn];
int main(){
    scanf("%d",&n);
    while(n--){
	    scanf("%s",str);
	    if(str[0]=='P'){
			st.clear();
		    s.push(st);
		    printf("0\n");
		}
		else if(str[0]=='D'){
			st=s.top();
			s.push(st);
			printf("%d\n",st.size());
			st.clear();
		}
		else if(str[0]=='U'){
		    it i,j;
		    st1=s.top();s.pop();
		    st2=s.top();s.pop();
		    i=st1.begin();j=st2.begin();
		    while(i!=st1.end() && j!=st2.end()){
			    if(*i!=*j)st.insert(*i),st.insert(*j),++j,++i;
			    else st.insert(*i),++i,++j;
			}
			while(i!=st1.end())st.insert(*i),++i;
			while(j!=st2.end())st.insert(*j),++j;
			printf("%d\n",st.size());
			s.push(st);st.clear();
		}
		else if(str[0]=='I'){
			it i,j;
		    st1=s.top();s.pop();
		    st2=s.top();s.pop();
		    i=st1.begin();j=st2.begin();
		    while(i!=st1.end() && j!=st2.end()){
			    if(*i<*j)++i;
			    else if(*i>*j)++j;
			    else st.insert(*i),++i,++j;
			}
			printf("%d\n",st.size());
			s.push(st);st.clear();
		}
		else if(str[0]=='A'){
			int i=1;it iter;
		    st1=s.top();s.pop();
		    st=s.top();s.pop();
		    if(st1.size()==0)i=0;
		    else for(iter=st1.begin();iter!=st1.end();++iter)i=(i*maxn%mod+*iter+11)%mod;
		    if(st.find(i)==st.end())st.insert(i);
		    s.push(st);
		    printf("%d\n",st.size());
		    st.clear();
		}
	}
	return 0;
}