# 2020q3 sysprog Homework13 (quiz13) ###### tags: `sysprog` contributed by < `sciyen` > [Toc] [作答表單](https://docs.google.com/forms/d/e/1FAIpQLSdmIWkQrL5ograFNkfudiDuXQ8Iyt-E4nmaWM6PE87czwGt9Q/viewscore?viewscore=AE0zAgAE0UgTYdLy7GgGZQIQ1RBtBoYN7R_tFpzxg6-D) ## Q1 [LeetCode 1239. Maximum Length of a Concatenated String with Unique Characters](https://leetcode.com/problems/maximum-length-of-a-concatenated-string-with-unique-characters/) ```c= for (int i = 0; i < arr_size; i++) { int k = 0; int len = strlen(arr[i]); for (int j = 0; j < len; j++) // Translate characters into bitwise composition k |= 1 << (arr[i][j] - 'a'); if (__builtin_popcount(k) != len) continue; // Add into potential list (a[]) a[i] = k; } ``` Example of translating characters into bitwise composition: ``` a -> 0b00000000000000000000000001 z -> 0b10000000000000000000000000 char -> 0b00000000100000000010000101 ``` Note,重複的字串無法符合題目條件的字串描述,因此無法加入參考選項。當 `1` 的個數比 `字元數量` 還少,表示字元內容有重複。因此跳過下一行的 ```c= a[i] = k; ``` ## Q2 該程式碼利用 `mmap()` 將檔案映射到記憶體,實現高效率的檔案複製。 ```c= src = mmap(NULL, len, PROT_READ, MAP_SHARED, src_fd, 0); ``` 將 destination 映射到記憶體 ```c= dst = mmap(NULL, len, PROP_READ | PROP_WRITE, MAP_SHARED, dst_fd, 0); ``` 檔案複製原本是 low level IO 操作,變成記憶體複製,可以利用例如 - memcpy - SIMD 等方式做資料複製。 ```c= for (size_t i = 0; i < len; i += page_size) { size_t block_size = (len - i) >= page_size ? page_size : (len - i); // if content is different if (memcmp(src + i, dst + i, block_size)) { // copy them with memcpy() memcpy(dst + i, src + i, block_size); write_count += block_size; } read_count += block_size; } ```