UVA12096 - The SetStack Computer(set + map映射)

來源:互聯網
上載者:User

標籤:style   http   color   io   os   ar   for   sp   代碼   

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映射)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.