비어있는 공집합 S가 주어졌을 때, 아래 연산을 수행하는 프로그램을 작성하시오.
제약조건: M (1 ≤ M ≤ 3,000,000)
1~20까지만 존재하므로 20개의 비트 생성
생성 후 위의 연산에 맞는 비트 연산 실행
1로 만들기 위해 1과 or 연산
제거하기 위해 1인 경우 1과 xor 연산
x에 위치하는 인덱스가 1인지 확인
1 -> 0
0 -> 1
을 만들 기 위해 xor 연산
모두 1로
모두 0으로
class IO11723 {
private val br = System.`in`.bufferedReader()
private val bw = System.out.bufferedWriter()
fun getM() = br.readLine().toInt()
fun getOperation() = br.readLine().split(" ")
fun flush() = bw.flush()
fun close() = bw.close()
fun write(message: String) = bw.write(message)
}
fun main() {
val io = IO11723()
val m = io.getM()
var bit: Long = 0b0 shl 19
repeat(m) {
val op = io.getOperation()
val num = if (op.size == 2) op[1].toInt() else 0
when (op[0]) {
"add" -> {
val comparison = 0b1 shl (num - 1)
bit = bit or comparison.toLong()
}
"remove" -> {
val str = bit.toString(2)
if (str.length >= num && str[str.lastIndex - num + 1] == '1') {
val comparison = 0b1 shl (num - 1)
bit = bit xor comparison.toLong()
}
}
"check" -> {
val str = bit.toString(2)
if (str.length >= num && str[str.lastIndex - num + 1] == '1') {
io.write("1\n")
} else {
io.write("0\n")
}
}
"toggle" -> {
val comparison = 0b1 shl (num -1)
bit = (bit xor comparison.toLong())
}
"all" -> {
bit = 0b1
repeat (19) {
bit = (bit shl 1) or 0b1
}
}
"empty" -> {
bit = 0b0 shl 19
}
}
}
io.flush()
io.close()
}