結果

問題 No.3036 Nauclhlt型文字列
コンテスト
ユーザー phspls
提出日時 2026-10-18 22:16:40
言語 Scala(Beta)
(3.10.0 + ACL)
コンパイル:
scalac -cp /opt/aclib/ac-library-scala.jar _filename_
実行:
/usr/bin/scala_run _class_
結果
AC  
実行時間 352 ms / 2,000 ms
+ 847µs
コード長 11,574 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 12,956 ms
コンパイル使用メモリ 310,096 KB
実行使用メモリ 57,428 KB
最終ジャッジ日時 2026-10-18 22:17:03
合計ジャッジ時間 20,013 ms
ジャッジサーバーID
(参考情報)
judge2_0 / judge3_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 15
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

import java.io.{InputStream, OutputStream, IOException, Closeable, Flushable}
import java.nio.charset.StandardCharsets

// ライブラリ一式
// https://github.com/phspls/scala-kyopro

/**
 * AtCoder向けの高速入出力ライブラリ (Scala Native / Scala 3 双方に対応)
 *
 * 【特徴】
 * 1. Scala Native (LLVM) および Scala 3 (JVM) の両方で追加依存なしにそのまま動作可能
 * 2. 64KB の内部バイトバッファによる低レベル高速読み込み・書き込み
 * 3. 文字列生成・ボクシングを極力排除した整数 (Int/Long) のダイレクトパース & フォーマット
 * 4. AtCoder で頻出する配列入力、複数タプル入力、Yes/No 出力、配列の一括出力などの便利メソッドを完備
 * 5. auto-flush を備えた FastIO.run ユーティリティにより flush 忘れによる WA/TLE を防止
 */
final class FastScanner(private val in: InputStream = System.`in`) {
  private val bufferSize: Int = 1 << 16 // 64 KB
  private val buffer: Array[Byte] = new Array[Byte](bufferSize)
  private var ptr: Int = 0
  private var buflen: Int = 0
  private var tokenBuf: Array[Byte] = new Array[Byte](64)

  @inline private def hasNextByte(): Boolean = {
    if (ptr < buflen) true
    else {
      ptr = 0
      try {
        buflen = in.read(buffer)
      } catch {
        case _: IOException => buflen = -1
      }
      buflen > 0
    }
  }

  @inline private def readByte(): Int = {
    if (hasNextByte()) {
      val b = buffer(ptr) & 0xFF
      ptr += 1
      b
    } else -1
  }

  @inline private def skipWhitespace(): Boolean = {
    while (hasNextByte() && (buffer(ptr) & 0xFF) <= 32) {
      ptr += 1
    }
    hasNextByte()
  }

  /** 次のトークン(空白以外の文字列)が存在するか判定 */
  def hasNext(): Boolean = skipWhitespace()

  /** 次のトークンを String として取得 (UTF-8 対応) */
  def next(): String = {
    if (!skipWhitespace()) throw new java.util.NoSuchElementException("No more tokens in input stream")
    var len = 0
    var b = readByte()
    while (b > 32) {
      if (len == tokenBuf.length) {
        val newBuf = new Array[Byte](tokenBuf.length * 2)
        java.lang.System.arraycopy(tokenBuf, 0, newBuf, 0, len)
        tokenBuf = newBuf
      }
      tokenBuf(len) = b.toByte
      len += 1
      b = readByte()
    }
    new String(tokenBuf, 0, len, StandardCharsets.UTF_8)
  }

  /** 次の 32bit 整数を取得(負数・Int.MinValue 対応) */
  def nextInt(): Int = {
    if (!skipWhitespace()) throw new java.util.NoSuchElementException("No more tokens in input stream")
    var b = readByte()
    var negative = false
    if (b == '-') {
      negative = true
      b = readByte()
    }
    if (b < '0' || b > '9') {
      throw new NumberFormatException(s"Invalid integer character: ${b.toChar}")
    }
    var res = -(b - '0')
    b = readByte()
    while (b >= '0' && b <= '9') {
      res = res * 10 - (b - '0')
      b = readByte()
    }
    if (negative) res else -res
  }

  /** 次の 64bit 整数を取得(負数・Long.MinValue 対応) */
  def nextLong(): Long = {
    if (!skipWhitespace()) throw new java.util.NoSuchElementException("No more tokens in input stream")
    var b = readByte()
    var negative = false
    if (b == '-') {
      negative = true
      b = readByte()
    }
    if (b < '0' || b > '9') {
      throw new NumberFormatException(s"Invalid integer character: ${b.toChar}")
    }
    var res = -(b - '0').toLong
    b = readByte()
    while (b >= '0' && b <= '9') {
      res = res * 10L - (b - '0')
      b = readByte()
    }
    if (negative) res else -res
  }

  /** 次の Double 値を取得 */
  def nextDouble(): Double = java.lang.Double.parseDouble(next())

  /** 次の非空白文字を 1 文字取得 */
  def nextChar(): Char = {
    if (!skipWhitespace()) throw new java.util.NoSuchElementException("No more tokens in input stream")
    readByte().toChar
  }

  /** 改行までの 1 行を取得 */
  def nextLine(): String = {
    if (!hasNextByte()) throw new java.util.NoSuchElementException("No more lines in input stream")
    var len = 0
    var b = readByte()
    while (b != -1 && b != '\n' && b != '\r') {
      if (len == tokenBuf.length) {
        val newBuf = new Array[Byte](tokenBuf.length * 2)
        java.lang.System.arraycopy(tokenBuf, 0, newBuf, 0, len)
        tokenBuf = newBuf
      }
      tokenBuf(len) = b.toByte
      len += 1
      b = readByte()
    }
    if (b == '\r') {
      if (hasNextByte() && (buffer(ptr) & 0xFF) == '\n') {
        ptr += 1
      }
    }
    new String(tokenBuf, 0, len, StandardCharsets.UTF_8)
  }

  // --- 便利メソッド (配列・タプル入力) ---

  def nextIntArray(n: Int): Array[Int] = {
    val arr = new Array[Int](n)
    var i = 0
    while (i < n) {
      arr(i) = nextInt()
      i += 1
    }
    arr
  }

  def nextLongArray(n: Int): Array[Long] = {
    val arr = new Array[Long](n)
    var i = 0
    while (i < n) {
      arr(i) = nextLong()
      i += 1
    }
    arr
  }

  def nextDoubleArray(n: Int): Array[Double] = {
    val arr = new Array[Double](n)
    var i = 0
    while (i < n) {
      arr(i) = nextDouble()
      i += 1
    }
    arr
  }

  def nextStringArray(n: Int): Array[String] = {
    val arr = new Array[String](n)
    var i = 0
    while (i < n) {
      arr(i) = next()
      i += 1
    }
    arr
  }

  def nextInt2(): (Int, Int) = (nextInt(), nextInt())
  def nextInt3(): (Int, Int, Int) = (nextInt(), nextInt(), nextInt())
  def nextInt4(): (Int, Int, Int, Int) = (nextInt(), nextInt(), nextInt(), nextInt())

  def nextLong2(): (Long, Long) = (nextLong(), nextLong())
  def nextLong3(): (Long, Long, Long) = (nextLong(), nextLong(), nextLong())
  def nextLong4(): (Long, Long, Long, Long) = (nextLong(), nextLong(), nextLong(), nextLong())
}

final class FastPrinter(private val out: OutputStream = System.out) extends Closeable with Flushable {
  private val bufferSize: Int = 1 << 16 // 64 KB
  private val buffer: Array[Byte] = new Array[Byte](bufferSize)
  private var ptr: Int = 0
  private val numBuf: Array[Byte] = new Array[Byte](24)

  @inline private def ensureCapacity(needed: Int): Unit = {
    if (ptr + needed > bufferSize) {
      flushBuffer()
    }
  }

  @inline private def flushBuffer(): Unit = {
    if (ptr > 0) {
      out.write(buffer, 0, ptr)
      ptr = 0
    }
  }

  override def flush(): Unit = {
    flushBuffer()
    out.flush()
  }

  override def close(): Unit = {
    flush()
    out.close()
  }

  @inline def print(c: Char): FastPrinter = {
    ensureCapacity(1)
    buffer(ptr) = c.toByte
    ptr += 1
    this
  }

  def print(s: String): FastPrinter = {
    val len = s.length
    var isAscii = true
    var i = 0
    while (i < len && isAscii) {
      if (s.charAt(i) >= 128) isAscii = false
      i += 1
    }
    if (isAscii) {
      i = 0
      while (i < len) {
        val chunk = Math.min(len - i, bufferSize - ptr)
        var j = 0
        while (j < chunk) {
          buffer(ptr + j) = s.charAt(i + j).toByte
          j += 1
        }
        ptr += chunk
        i += chunk
        if (ptr == bufferSize) flushBuffer()
      }
    } else {
      val bytes = s.getBytes(StandardCharsets.UTF_8)
      var off = 0
      while (off < bytes.length) {
        val chunk = Math.min(bytes.length - off, bufferSize - ptr)
        java.lang.System.arraycopy(bytes, off, buffer, ptr, chunk)
        ptr += chunk
        off += chunk
        if (ptr == bufferSize) flushBuffer()
      }
    }
    this
  }

  def print(x: Int): FastPrinter = {
    ensureCapacity(16)
    if (x == 0) {
      buffer(ptr) = '0'.toByte
      ptr += 1
    } else {
      var n = x
      if (n < 0) {
        buffer(ptr) = '-'.toByte
        ptr += 1
        if (n == Int.MinValue) {
          val s = "2147483648"
          var i = 0
          while (i < 10) {
            buffer(ptr) = s.charAt(i).toByte
            ptr += 1
            i += 1
          }
          return this
        }
        n = -n
      }
      var idx = 0
      while (n > 0) {
        numBuf(idx) = ((n % 10) + '0').toByte
        n /= 10
        idx += 1
      }
      while (idx > 0) {
        idx -= 1
        buffer(ptr) = numBuf(idx)
        ptr += 1
      }
    }
    this
  }

  def print(x: Long): FastPrinter = {
    ensureCapacity(24)
    if (x == 0L) {
      buffer(ptr) = '0'.toByte
      ptr += 1
    } else {
      var n = x
      if (n < 0L) {
        buffer(ptr) = '-'.toByte
        ptr += 1
        if (n == Long.MinValue) {
          val s = "9223372036854775808"
          var i = 0
          while (i < 19) {
            buffer(ptr) = s.charAt(i).toByte
            ptr += 1
            i += 1
          }
          return this
        }
        n = -n
      }
      var idx = 0
      while (n > 0L) {
        numBuf(idx) = ((n % 10L) + '0').toByte
        n /= 10L
        idx += 1
      }
      while (idx > 0) {
        idx -= 1
        buffer(ptr) = numBuf(idx)
        ptr += 1
      }
    }
    this
  }

  def print(d: Double): FastPrinter = print(d.toString)

  def print(d: Double, precision: Int): FastPrinter = {
    print(String.format(java.util.Locale.US, s"%.${precision}f", java.lang.Double.valueOf(d)))
  }

  def print(b: Boolean): FastPrinter = print(if (b) "true" else "false")

  @inline def println(): FastPrinter = {
    ensureCapacity(1)
    buffer(ptr) = '\n'.toByte
    ptr += 1
    this
  }

  @inline def println(x: Int): FastPrinter = { print(x); println() }
  @inline def println(x: Long): FastPrinter = { print(x); println() }
  @inline def println(d: Double): FastPrinter = { print(d); println() }
  @inline def println(d: Double, precision: Int): FastPrinter = { print(d, precision); println() }
  @inline def println(s: String): FastPrinter = { print(s); println() }
  @inline def println(c: Char): FastPrinter = { print(c); println() }
  @inline def println(b: Boolean): FastPrinter = { print(b); println() }

  /** AtCoder で頻出する Yes / No 判定出力 */
  @inline def printlnYesNo(cond: Boolean, upper: Boolean = false): FastPrinter = {
    if (upper) {
      println(if (cond) "YES" else "NO")
    } else {
      println(if (cond) "Yes" else "No")
    }
  }

  /** 配列の要素を空白区切りで出力(末尾改行なし) */
  def printArray(arr: Array[Int], sep: String = " "): FastPrinter = {
    var i = 0
    val len = arr.length
    while (i < len) {
      if (i > 0) print(sep)
      print(arr(i))
      i += 1
    }
    this
  }

  /** 配列の要素を空白区切りで出力し、最後に改行 */
  def printlnArray(arr: Array[Int], sep: String = " "): FastPrinter = {
    printArray(arr, sep)
    println()
  }
}


/**
 * 提出用テンプレートの実装例 (Main.scala)
 *   @main
 *   def main(args: Array[String]): Unit = {
 *     val in = new FastScanner()
 *     val out = new FastPrinter()
 *
 *     val n = in.nextInt()
 *     val a = in.nextIntArray(n)
 *     out.println(a.sum)
 *
 *     out.flush() // 最後に必ず flush を呼ぶこと
 *   }
 */

@main
def main(): Unit =
  val in = new FastScanner()
  val out = new FastPrinter()

  // ----------------------
  // 解法ロジック記述エリア
  // ----------------------
  val n = in.nextInt()
  val s = in.next()
  if (n % 2 == 0) {
    println("Yes")
    val x = (0 until n by 2).map(i => s(i)).mkString
    val y = (1 until n by 2).map(i => s(i)).mkString
    print(x)
    print(" ")
    println(y)
  } else {
    println("No")
  }

  out.flush() // 最後に必ず flush を呼ぶこと
0