https://www.acmicpc.net/problem/13701
이 문제는 메모리 제한이 8MB 이므로 2^25만큼의 배열을 사용하면 메모리 초과가 뜹니다.
따라서 이를 수를 구분할 수 있는 몫과 나머지를 이용한 비트마스킹을 이용합니다.
인덱스는 몫이 되겠으며, 비트로 사용할 값은 나머지입니다.
x라는 몫에 y라는 나머지가 있는지 비트 연산자로 확인합니다.
y라는 나머지가 있으면 출력, 없으면 return을 시키면 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#include <iostream>
#define MAX 1 + (1 << 20)
using namespace std;
int list[MAX];
void func(int N) {
int x = N >> 5;
int y = N % 32;
int z = (1 << y);
if (list[x] & z) return;
list[x] |= z;
cout << N << ' ';
}
int main() {
cin.tie(NULL); cout.tie(NULL);
ios::sync_with_stdio(false);
int N;
while (cin >> N) {
func(N);
}
return 0;
}
|
cs |