[BOJ] 13504 XOR 합 - P3

TaeGN·2024년 9월 8일

BOJ Platinum Challenge

목록 보기
61/114

문제풀이

  1. trie 자료 구조를 구현한다.
  2. 현재까지의 누적합과 trie 자료 구조 내부의 값을 xor한 것 중에 가장 큰 값을 구한다.
  3. 현재까지의 누적합을 trie 자료 구조에 add한다.
  4. N개의 수에 대하여 2, 3번을 반복한다.

주의사항


소요시간

35분


package 백준.Platinum.P3.p13504_XOR합

class Trie(val idx: Int) {
    val children = Array<Trie?>(2) { null }
    fun add(str: String) {
        if (str.length == idx) return
        getChild(str[idx]).add(str)
    }

    private fun getChild(c: Char): Trie {
        if (children[c.digitToInt()] == null) children[c.digitToInt()] = Trie(idx + 1)
        return children[c.digitToInt()]!!
    }

    fun result(str: String): String? {
        if (str.length == idx) return ""
        val curBit = str[idx].digitToInt()
        if (children[(curBit + 1) % 2] != null) children[(curBit + 1) % 2]!!.result(str)?.let { return "1$it" }
        if (children[curBit] != null) children[curBit]!!.result(str)?.let { return "0$it" }
        return null
    }
}

fun main() {
    fun Int.toBinaryString() = toString(2).let { "${"0".repeat(32 - it.length)}$it" }
    val sb = StringBuilder()
    repeat(readln().toInt()) {
        readln()
        val trie = Trie(0)
        var result = 0
        var sum = 0
        for (elm in readln().trim().split(" ").map(String::toInt)) {
            sum = sum xor elm
            val str = sum.toBinaryString()
            result = maxOf(result, sum, trie.result(str)?.toInt(2) ?: 0)
            trie.add(str)
        }
        sb.appendLine(result)
    }
    println(sb)
}

https://github.com/TaeGN/Algorithm/blob/master/src/%EB%B0%B1%EC%A4%80/Platinum/P3/p13504_XOR%ED%95%A9/p13504_XOR%ED%95%A9.kt


문제링크

https://www.acmicpc.net/problem/13504

0개의 댓글