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