UVA - 12096:The SetStack Computer

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

需要注意的一點是在switch語句中的case語句后面不能直接聲明局部變量,要放在大括號里面,形成一個局部變量。其原因是如果直接定義的話,其他case語句也是可以看到這個變量的,但是如果不執行那個定義的case語句,就會導致變量聲明卻沒有定義。原因在于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";}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383537.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383537.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383537.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

UVA - 540:Team Queue

主要的關鍵在于&#xff1a;不要試圖讓所有團隊的人在一個隊列里面&#xff0c;因為這樣如果新入隊的是一個前面團隊的成員則必須先出隊再入隊。 應該把每個團隊看做一個整體&#xff0c;用一個隊列維護團隊的順序&#xff0c;用t個隊列維護每個團隊內部的順序。 還有就是要維…

UVA-136:Ugly Numbers

很簡單的一道題&#xff0c;但是我竟然蠢到想不明白為什么如果從頭生成會出現大量重復的數字。 寫的時候主要出現的錯誤在爆int上&#xff0c;一定要注意數據范圍。 #include <iostream> #include <queue> #include <set>using namespace std; using ll lo…

類的成員函數可以訪問屬于該類的任意對象的私有變量

之前在書上看到成員函數可以訪問類的私有變量的時候覺得是廢話嘛&#xff0c;如果成員函數都不能訪問那私有變量不就變成了花瓶了。然而發現自己還是太naive。 這句話的意思是&#xff1a;在類的作用域內&#xff0c;包含成員函數、靜態成員函數和友元函數內&#xff0c;可以訪…

GMP使用入門

最近寫了一個高精度的模板&#xff0c;想要用GMP庫測試一下&#xff0c;總結一下GMP環境的搭建。 環境搭建&#xff1a;GMP大法教你重新做人(從入門到實戰) 解壓.tar.lz的 時候可能會遇到一點問題&#xff0c;可以參考這個博客&#xff1a;.tar.lz壓縮包解壓 需要注意的是C需要…

UVA - 400:Unix ls

題目的難點在于要求前面的每一列的是最大長度L2&#xff0c;最后一列的長度是L。對于寬度為WIDTH60的一行來說&#xff0c;一行可以放下多少個單詞決定了需要多少行&#xff0c;知道了行數才能開始根據行數開始放置。 我的做法是col (WIDTH 2) / (L 2)&#xff0c;即提前給W…

UVA - 1592:Database

題目的意思是找到兩行在兩列處相等&#xff0c;主要要做的是記錄某個值是否重復出現過。 經過思考&#xff0c;我的思路是&#xff1a;每一列用一個unordered_map<string,vector<int>>記錄單詞出現的行數&#xff0c;對于某一行中的兩列&#xff0c;如果有兩個元素…

C++ array初始化需要雙層大括號

對于array的初始化我們可以使用列表初始化&#xff1a; array<int, 8> test {1,2,3,4,5,6,7,8 };但是當我們不再使用簡單的內置類型array時&#xff1a; array<pair<int, int>, 8> dirs {{-1, -1},{-1, 0},{-1, 1},{0, -1},{0, 1},{1, -1},{1, 0},{1, 1}…

Qt for Android環境配置

最近想寫一個小APP&#xff0c;但是又不想用Android Studio進行開發&#xff0c;想要用C進行開發&#xff0c;聽說Qt可以進行Android開發&#xff0c;就想嘗試一下&#xff0c;結果花了一天時間來配置環境。。。而且發現windows下配置環境更簡單一些&#xff08;我中途還切換到…

UVa-12333:Revenge of Fibonacci 高精度

之前自己仿照紫書上寫了高精度庫&#xff0c;完善了乘法、減法&#xff0c;并且通過了和C高精度庫GMP的對拍測試&#xff0c;并在一些OJ上過了一些高精度的模板題&#xff0c;代碼倉庫地址&#xff1a;https://github.com/Edward-Elric233/BigInt 求解思路 題目的意思是求前1…

vim命令筆記

vim折疊函數&#xff1a;https://www.cnblogs.com/zlcxbb/p/6442092.html Vim錄制宏及使用&#xff1a;https://www.jianshu.com/p/9d999c72a9f3 將vim與系統剪貼板的交互使用&#xff1a;https://zhuanlan.zhihu.com/p/73984381

Educational Codeforces Round 114總結

緒論 https://codeforces.com/contest/1574/ 以前想要打CF&#xff0c;總是覺得沒有時間&#xff0c;要做這個&#xff0c;要做那個&#xff0c;現在時間充裕了一些&#xff0c;想要多打一些CF&#xff0c;但是光打比賽不總結是沒有什么幫助的&#xff0c;這是我從以前的ACM訓…

UVA - 210:Concurrency Simulator

題目鏈接&#xff1a;https://vjudge.net/problem/UVA-210 題目分析 就是一道模擬題&#xff0c;但是細節有點多。 寫代碼兩個小時&#xff0c;調試代碼用了兩天。。。很長時間不刷題了&#xff0c;這道雖然算法簡單但是細節滿滿的題目對我來說是一個很好的熱身。 盡量不要去…

UVA - 514:Rails

題目鏈接&#xff1a;https://vjudge.net/problem/UVA-514 題目分析 題目的意思是給一個棧輸入一系列數據&#xff0c;在這個過程中可以出棧&#xff0c;看能否達到某個結果。 剛開始我覺得這個情況好多&#xff0c;因此不是用模擬&#xff0c;而應該觀察結果本身。對于結果中…

UVA - 442:Matrix Chain Multiplication

題目鏈接&#xff1a;https://vjudge.net/problem/UVA-442 題目分析 題目的意思非常簡單&#xff0c;就是給定一個矩陣乘法的表達式然后計算就可以了。隨便寫寫 AC代碼 #include <iostream> #include <deque> #include <vector> #include <string>…

leetcode869. 重新排序得到 2 的冪

題目連接&#xff1a;https://leetcode-cn.com/problems/reordered-power-of-2/ 題目分析 如果直接順著題目的思路&#xff0c;得到數字n的全排列&#xff0c;然后再去判斷其是不是2的冪是比較復雜的。 我們應該注意到&#xff0c;因為數字是可以隨意排列的&#xff0c;因此所…

使用wireshark+ssh+tcpdump遠程抓包

因為需要抓取遠程服務器上的數據包&#xff0c;又不想使用tcpdump這種命令行工具進行&#xff08;用了wireshark后誰還愿意去看密密麻麻的命令行呢&#xff09;&#xff0c;所以在網上查找了一下使用wireshark遠程抓包的方法&#xff0c;在這里記錄一下。 原生支持 wireshark…

C++ Variadic Templates(可變參數模板)

本文參考侯捷老師的視頻&#xff1a;https://www.youtube.com/watch?vTJIb9TGfDIw&listPL-X74YXt4LVYo_bk-jHMV5T3LHRYRbZoH 以及C primer第五版 相關內容。 可變參數模板函數 //遞歸的終止條件 void print() {} //Variadic Templates //一般用于遞歸處理 template <…

Ubuntu修復Fix Busybox Initramfs錯誤

今天早上我打開電腦&#xff0c;進入Ubuntu系統&#xff0c;結果黑屏了&#xff0c;屏幕顯示&#xff1a; BusyBox v1.30.1 (Ubuntu 1:1.30.1-4ubuntu6.1) built-in shell (ash) Enter help for a list of built-in commands.(initramfs)然而我并不知道這個是什么意思&#x…

Leetcode第284場周賽

緒論 最近發現Leetcode每周的周賽難度挺適合我的&#xff0c;而且時間也比較友好&#xff08;不像Codeforces每次都是半夜&#xff09;。所以連續參加了三周的周賽。這次才想起來應該記錄一下自己的參賽歷程。一方面是總結經驗&#xff0c;另一方面有了記錄就更有動力去提升&a…

Leetcode第286場周賽

緒論 上周因為有事沒有參加周賽&#xff0c;這周沒有錯過。這次周賽拿到了人生第一個AK&#xff0c;參加大大小小的比賽這么多次&#xff0c;從來沒有AK過&#xff0c;淚目了。 感覺這次比賽的思維難度對我來講稍高一些&#xff0c;前三道題就花了一個小時&#xff0c;而以往…