Problem:
MathJax.Hub.Config({
tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}
});

B: ハミング距離 / Hamming Distance

問題文

Leading-zeros を含めた桁数が $N$ の，符号なし $2$ 進数表記された整数 $X$ がある．
$X$ とのハミング距離が $D$ となる $N$ 桁で $2$ 進数表記できる非負整数のうち，
値が最大のものを出力せよ．

$2$ 進数表記された整数間のハミング距離とは，
$2$ つの数において値が異なる桁の数である．例えば $000$ と $110$ のハミング距離は $2$ である．

入力

$N$

$X$

$D$

制約

$1 \leq N \leq 1000$

$0 \leq D \leq N$

入力は全て非負整数である

出力

答えの整数を符号なし $2$ 進数表記で $1$ 行に出力せよ．

サンプル

サンプル入力1

5
00001
3

サンプル出力1

11101

サンプル入力2

7
0110100
4

サンプル出力2

1111111

サンプル入力3

18
110001001110100100
6

サンプル出力3

111111111111100100

サンプル入力4

3
000
0

サンプル出力4

000

Solution in Scala (judge verdict: Accepted)

import scala.annotation.tailrec
object Main extends App {
  import scala.io.StdIn._

  val n = readInt
  val x = readLine.trim
  val d = readInt
  println(calMaxHamming(x, d))
  def calMaxHamming(x: String, d: Int): String = {
    @tailrec
    def sub(distance: Int, digits: List[Int], result: List[Char]): List[Char]= {
      digits match {
        case 1::xs if distance <= xs.length ⇒ sub(distance, xs, '1'::result)
        case 0::xs if distance > 0 ⇒ sub(distance - 1, xs, '1'::result)
        case 0::xs ⇒ sub(distance, xs, '0'::result)
        case 1::xs ⇒ sub(distance - 1, xs, '0'::result)
        case Nil ⇒ result
        case _ ⇒ ???
      }
    }
    sub(d, x.map(_.asDigit).toList, Nil).reverse.mkString
  }
  implicit class Scope[T](val value: T) extends AnyVal {
    @inline def also(@inline func: T ⇒ Unit): T = {
      func(value)
      value
    }
    @inline def let[A](@inline func: T ⇒ A): A = func(value)
  }
}