Problem:
坊主めくりの結末

百人一首の札を使った遊戯の１つに、「坊主めくり」というものがあります。絵札だけを使う簡単な遊戯なので広く楽しまれています。きまりには様々な派生型がありますが、ここで考える坊主めくりはN人の参加者で、以下のようなルールで行います。

６４枚の「男」、１５枚の「坊主」、２１枚の「姫」、計１００枚の札を使う。

絵が見えないように札を裏がえしにしてよく混ぜ、「札山」をつくる。

参加者の一人目から順番に１枚ずつ札山の札を引く。N人目の次は、また一人目から繰り返す。

引いた札が男なら、引いた人はその札を手に入れる。

引いた札が坊主なら、引いた人はその札を含め、持っている札をすべて「場」に出す。

引いた札が姫なら、引いた人はその札を含め、場にある札をすべて手に入れる。

札山の札がなくなったら終了で、一番多くの札を持っている人の勝ち。

参加者数と札山に積まれた札の順番が与えられたとき、遊戯が終了した時点で各参加者が持っている札数を昇順で並べたものと、場に残っている札数を出力するプログラムを作成してください。

入力

入力は複数のデータセットからなる。入力の終わりはゼロ一つの行で示される。各データセットは以下の形式で与えられる。

N
c1c2 ... c100

各データセットは2行であり、1行目に参加者数を表す整数N(2 ≤ N ≤ 10)が与えられる。続く1行に札山に積まれた札の並びを表す文字列が与えられる。文字ciはi番目に引かれる札を表しており、Mが男、Sが坊主、Lが姫の札を表す。各文字の間に空白は無い。

データセットの数は100を超えない。

出力

データセットごとに、遊戯が終了した時点での札数の並びを１行に出力する。札数の並びとして、各参加者が持っている札の枚数を昇順に並べだものの後に、場に残っている札の枚数を出力する。各札数の間は空白１つで区切る。行の終わりには空白を出力しない。

入力例

2
SSSSSSSSSSSSSSSLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
2
SSSSSSSSSSSSSSLLLLLLLLLLLLLLLLLLLLMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMSL
5
MMMMMMSLSLLMMMSMMSLMMMLMMMMLSLLLLMLSMMLMMLLMSSSLMMMMLMLSMLMSMMMMMMMSMMMMMMLMMMMMSMMMLMMLMMMMMMMMMSSM
0

出力例

42 58 0
0 100 0
0 0 3 10 59 28

Solution in Scala (judge verdict: Accepted)

import java.util.Scanner

import scala.collection.Searching._
import scala.annotation.tailrec
import scala.collection.immutable.Queue

class IUnionFind(val size: Int) {

  private case class Node(var parent: Option[Int], var treeSize: Int)

  private val nodes = Array.fill[Node](size)(new Node(None, 1))

  def union(t1: Int, t2: Int): IUnionFind = {
    if (t1 == t2) return this

    val root1 = root(t1)
    val root2 = root(t2)
    if (root1 == root2) return this

    val node1 = nodes(root1)
    val node2 = nodes(root2)

    if (node1.treeSize < node2.treeSize) {
      node1.parent = Some(t2)
      node2.treeSize += node1.treeSize
    } else {
      node2.parent = Some(t1)
      node1.treeSize += node2.treeSize
    }
    this
  }

  def connected(t1: Int, t2: Int): Boolean = t1 == t2 || root(t1) == root(t2)

  @tailrec
  private def root(t: Int): Int = nodes(t).parent match {
    case None => t
    case Some(p) => root(p)
  }
}


object Main {
  def solve(sc: => Scanner): Unit = {
    val n = sc.nextInt
    if (n != 0) {
      val s = sc.next
      val A = Array.fill(n)(0)
      var stage = 0
      for (i <- Range(0, 100)) {
        s(i) match {
          case 'M' => A(i % n) += 1
          case 'L' => {
            A(i % n) += 1 + stage
            stage = 0
          }
          case 'S' => {
            stage += 1 + A(i % n)
            A(i % n) = 0
          }
        }
      }
      println(A.sorted.mkString(" ") + " " + stage)
      solve(sc)
    }
  }

  def main(args: Array[String]): Unit = {
    val sc: Scanner = new Scanner(System.in)
    solve(sc)
  }
}