日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UVA - 12096:The SetStack Computer

發(fā)布時間:2023/11/30 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UVA - 12096:The SetStack Computer 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目描述很簡單,難點在于如何對集合進(jìn)行編碼,因為是無限的,好像沒有一個方向進(jìn)行編碼。
紫書給的題解十分巧妙:給新出現(xiàn)的集合進(jìn)行編碼
的確,我們沒有必要為所有可能出現(xiàn)的集合編碼后再開始,我們就可以簡單的根據(jù)出現(xiàn)的次序分配一個映射值即可,這個值只要能夠代表這個集合并且不發(fā)生碰撞。
另一個巧妙的點是STL中的map竟然支持從對set的哈希,這個也太神奇了,雖然不明白是怎么做的,可能要看源碼才能理解。
代碼如下:

需要注意的一點是在switch語句中的case語句后面不能直接聲明局部變量,要放在大括號里面,形成一個局部變量。其原因是如果直接定義的話,其他case語句也是可以看到這個變量的,但是如果不執(zhí)行那個定義的case語句,就會導(dǎo)致變量聲明卻沒有定義。原因在于switch其實就是一種奇特的goto。

#include <iostream> #include <map> #include <set> #include <vector> #include <stack> #include <string> #include <algorithm> #include <iterator>using namespace std; using Set = set<int>;class SetHash {vector<Set> num2set; //保存num到set的映射map<Set, int> set2num; //保存set到num的映射 public:int operator ()(Set s); //獲取一個set的hash值Set operator ()(int num);//獲取一個hash值為num的setint getSize(int num) const; };int SetHash::operator()(Set s) {if (!set2num.count(s)) {set2num[s] = num2set.size();num2set.push_back(s);return num2set.size() - 1;} else {return set2num[s];} }Set SetHash::operator()(int num) {return num2set[num]; }int SetHash::getSize(int num) const {return num2set[num].size(); }stack<int> stk; //用于保存集合棧int main() {ios::sync_with_stdio(false);int T, n;string cmd;SetHash setHash;cin >> T;while (T--) {cin >> n;while (n--) {cin >> cmd;if (cmd[0] == 'P') stk.push(setHash(Set()));else if (cmd[0] == 'D') stk.push(stk.top());else {Set a = setHash(stk.top()); stk.pop();Set b = setHash(stk.top()); stk.pop();switch (cmd[0]) {case 'U':b.insert(a.begin(), a.end());stk.push(setHash(b));break;case 'I':{Set c;set_intersection(a.begin(), a.end(), b.begin(), b.end(), inserter(c, c.begin()));stk.push(setHash(c));break;}case 'A':b.insert(setHash(a));stk.push(setHash(b));break;} //}cout << setHash.getSize(stk.top()) << "\n";}cout << "***\n";} }

總結(jié)

以上是生活随笔為你收集整理的UVA - 12096:The SetStack Computer的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。