對於UVa12096「集合的集合」的理解

2021-07-09 15:45:07 字數 2100 閱讀 5000

這裡為每個集合分配了乙個唯一的 id,使用了 std::map 實現集合到整數型別的對應。map 中的集合屬於物件型別,起初難以接受,不過既然是模板,那麼什麼型別都是可以裝載的。

函式 id 起到了從 set 到 int 的轉換,並且新增了新家入的集合和整數id的對映以及id到集合的訪問

int id(set x)
乍一看**有點不知所措,其實分析明白容器中都裝的是什麼就會明白:

set 例項化的物件如果是空集那麼其中就沒有元素,如果有其他集合,呢麼 set 中的元素就是代表集合的 id 整數。而每個集合又都有map為之分配的 id 。而 stack 中裝載就就是這樣的 id。實質就是模擬操作,只不過將 set 對映 到了 int。

整個的邏輯是這樣的:

判斷是何操作:

1.push:向棧 s 中 push 乙個經過 id 函式轉換後集合對應的整數

2.dup:再向集合中加入乙個棧頂層的整數元素

3.union:取出兩棧頂元素,經set_union後為這個新集合分配id,再push

4.intersect:取出兩棧頂元素,經set_intersection後衛這個新集合分配id,再push

其ac**如下:

#define all(x) x.begin(), x.end()

#define ins(x) inserter(x, x.begin())

typedef

set set;

mapint> idcache;

vector

setcache;

int id(set x)

int main()

s.push(id(x));

}cout

<< setcache[s.top()].size() << endl;

}cout

<< "***"

<< endl;

}return

0;}

以及uva1592

也使用了類似的將乙個物件對映成乙個整型的方法/思路

using

namespace

std;

#define all(x) x.begin(), x.end()

#define ins(x) inserter(x, x.begin())

const

int maxr = 10000 + 5;

const

int maxc = 10 + 5;

typedef pair pii;

int m, n, db[maxr][maxc], cnt;

map id; // string --> id

int id(const

string &s)

void find()

d[p] = i;}}

}printf("yes\n");

}int main()

}find();

}return

0;}

其接收兩個整型引數的操作有些詭異,是為了演示 stringstream 的用法。可以使用 while(cin >> m >> n && m) 的寫法。

while (getline(cin, s))
使用 getline(cin, s) 迴圈接收 n 行字串,在處理每行字串前定義乙個 lastpos 用以記錄字串處理到**。接著對 m 列字串處理,查詢 『,』 得到查詢到的位置 p,判斷是否找到使用到了 string::pos,如果 p==string::pos 說明沒有找到。substr 將擷取子字串並由 id 函式轉化為乙個 id ,最終儲存在 db 陣列 中。

for (int i = 0; i < n; ++i) 

}

最後是 find 函式,列舉所有的兩列。並對每個兩列進行列舉每行,若出現了相同的對,則說明有重複。這裡的 map

void find() 

d[p] = i;}}

}printf("yes\n");

}

UVa 12096 集合棧計算機

這題的話,我們讀入操作之後,首先對於空集就是初始化為空。我們可以使用typedef 對於 set 重新命名為set,這樣就可以直接用set 的語法進行空集的初始化了。這題主要是對於集合的處理,我們可以給集合乙個對映函式,這個函式對於已知集合就返回該id,讓主函式進行相應的操作。對於未知集合就按序存入...

uva 12096 集合棧計算機

uva 12096 集合棧計算機 題目 有乙個專門為了集合運算而設計的 集合棧 計算機。該機器有乙個初始為空的棧,並且 支援以下操作。push 空集 入棧。dup 把當前棧頂元素複製乙份後再入棧。union 出棧兩個集合,然後把二者的並集入棧。intersect 出棧兩個集合,然後把二者的交集入棧。...

UVa 12096 集合棧計算機

對於乙個以集合為元素的棧,初始時棧為空。輸入的命令有如下幾種 push 將空集 壓棧 dup 將棧頂元素複製乙份壓入棧中 union 先進行兩次彈棧,將獲得的集合a和b取並集,將結果壓棧 intersection 先進行兩次彈棧,將獲得的集合a和b取交集,將結果壓棧 add 先進行兩次彈棧,將獲得的...