Problem:
Score : 200 points

Problem Statement

Takahashi is participating in a programming contest called AXC002, and he has just submitted his code to Problem A.

The problem has N test cases.

For each test case i (1\leq i \leq N), you are given a string S_i representing the verdict for that test case. Find the numbers of test cases for which the verdict is AC, WA, TLE, and RE, respectively.

See the Output section for the output format.

Constraints

1 \leq N \leq 10^5

S_i is AC, WA, TLE, or RE.

Input

Input is given from Standard Input in the following format:

N
S_1
\vdots
S_N

Output

Let C_0, C_1, C_2, and C_3 be the numbers of test cases for which the verdict is AC, WA, TLE, and RE, respectively. Print the following:

AC x C_0
WA x C_1
TLE x C_2
RE x C_3

Sample Input 1

6
AC
TLE
AC
AC
WA
TLE

Sample Output 1

AC x 3
WA x 1
TLE x 2
RE x 0

We have 3, 1, 2, and 0 test case(s) for which the verdict is AC, WA, TLE, and RE, respectively.

Sample Input 2

10
AC
AC
AC
AC
AC
AC
AC
AC
AC
AC

Sample Output 2

AC x 10
WA x 0
TLE x 0
RE x 0

Solution in Scala (2.13.1) (judge verdict: Accepted)

import java.security.KeyStore.TrustedCertificateEntry
import java.util
import java.util.regex.Pattern
import java.util.{ArrayList, Collections, Comparator, List => JList}

import scala.collection.immutable.TreeMap
import scala.math._
import scala.collection.mutable
import scala.collection.mutable.{ArrayBuffer, ListBuffer}
import scala.util.{Failure, Success, Try}

object Main{
  val LS = "\n"
  def main(args: Array[String]): Unit = {
    if (sys.env.getOrElse("TEST", "")=="1"){
      println(test());
    }else{
      val input=io.Source.stdin.getLines().mkString(LS);
      println(solve(input).trim());
    }
  }

  def init (nRows: Int, nCols: Int, default: Int) = Array.tabulate(nRows,nCols)( (x,y) =>  default)

  def sortIgnoreCase1(list: JList[String]): JList[String] = {
    val r = new ArrayList[String](list)
    Collections.sort(r, new Comparator[String] {
      override def compare(o1: String, o2: String): Int = o1.compareToIgnoreCase(o2)
    })
    r
  }

//  def solve(input: String): String = {
//    val Array(n, q) = input.split(LINE_SEPARATOR).head.split(" ").map(_.toInt)
//    val a = input.split(LINE_SEPARATOR).tail.take(n).map(_.split(" ").head.toInt)
//    val b = input.split(LINE_SEPARATOR).tail.take(n).map(_.split(" ").tail.head.toInt)
//    val c = input.split(LINE_SEPARATOR).drop(n + 1).map(_.split(" ").head.toInt)
//    val d = input.split(LINE_SEPARATOR).drop(n + 1).map(_.split(" ").tail.head.toInt)
//    val k = 2 * pow(10, 5).toInt
//    val INF = pow(10, 9).toInt + 1
//    val pqMap = (0 until k).map(_ => new mutable.TreeMap[Int, Int]).toArray
//    def add(k: Int, ai: Int): Unit = {
//      val count = pqMap(k).getOrElse(ai, 0)
//      pqMap(k) += ai -> (count + 1)
//    }
//    def delete(k: Int, ai: Int): Unit = {
//      val count = pqMap(k).getOrElse(ai, 0)
//      if (count == 1) pqMap(k) -= ai else pqMap(k) += ai -> (count - 1)
//    }
//    val i2k = (0 until n).map{i =>
//      b(i)
//    }.toArray
//    (0 until n).foreach{i =>
//      add(b(i) - 1, a(i))
//    }
//    val maxList = pqMap.map(pq => if (pq.nonEmpty) pq.last._1 else INF)
//
//    (0 until q).map{j =>
//      add(d(j) - 1, a(c(j) - 1))
//      delete(i2k(c(j) - 1) - 1, a(c(j) - 1))
//      maxList(i2k(c(j) - 1) - 1) =
//        if (pqMap(i2k(c(j) - 1) - 1).nonEmpty) pqMap(i2k(c(j) - 1) - 1).last._1 else INF
//      i2k(c(j) - 1) = d(j)
//      maxList(d(j) - 1) = if (pqMap(d(j) - 1).nonEmpty) pqMap(d(j) - 1).last._1 else INF
//      maxList.min
//    }.mkString(LINE_SEPARATOR)
//  }

  def solve(input: String): String = {
    val n = input.split(LS).head.toInt
    val s = input.split(LS).tail
    val ac = s.count("AC" == _)
    val wa = s.count("WA" == _)
    val tle = s.count("TLE" == _)
    val re = s.count("RE" == _)

    s"AC x $ac" + LS +
    s"WA x $wa" + LS +
    s"TLE x $tle" + LS +
    s"RE x $re"
  }

  def divideDigits(num: Long, base: Long = 10L): List[Long] = {
    def proc(num: Long, base: Long, flg: Boolean): List[Long] = {
      var flag = flg
      val quotient = num / base
      val remainder = if (num % base == 0) {
        flag = true
        base
      } else if (flag) {
        flag = false
        val temp = num % base - 1
        if (temp == 0) {
          flag = true
          base - 1
        } else temp
      } else {
        flag = flg
        num % base
      }
      quotient match {
        case 0 =>
          if (flag) {
            List.empty
          } else List(remainder)
        case _ => remainder :: proc(quotient, base, flag)
      }
    }

    proc(num, base, false).reverse//.filterNot(_ == 0)
  }


  def medianCalculator(seq: Seq[Long]): Long = {
    //In order if you are not sure that 'seq' is sorted
    val sortedSeq = seq.sortWith(_ < _)

    if (seq.size % 2 == 1) sortedSeq(sortedSeq.size / 2)
    else {
      val (up, down) = sortedSeq.splitAt(seq.size / 2)
      (up.last + down.head) / 2
    }
  }

  def factorize(x: Long): List[Long] = {
    def foo(x: Long, a: Long = 2, list: List[Long] = Nil): List[Long] = a*a > x match {
      case false if x % a == 0 => foo(x / a, a    , a :: list)
      case false               => foo(x    , a + 1, list)
      case true                => x :: list
    }
    foo(x)
  }

  def divisors(n: Int): Vector[Int] = {
    val halfList = (1 to sqrt(n).toInt).toVector.filter(n % _ == 0).map(_.toInt)
    val reversedList = if (sqrt(n).floor == sqrt(n)) halfList.reverse.tail.map(n/_) else halfList.reverse.map(n/_)
    halfList ++ reversedList
  }

  def gcd(m: Long, n: Long): Long = n match {
    case 0 => m
    case _ => gcd(n, m % n)
  }
  def lcm(a: Long, b: Long): Long = a * b / gcd(a, b)

  val tests=List(
    """6
      |AC
      |TLE
      |AC
      |AC
      |WA
      |TLE""".stripMargin -> """AC x 3
                                   |WA x 1
                                   |TLE x 2
                                   |RE x 0
                                   |
                                |""".stripMargin
    ,
    """10
      |AC
      |AC
      |AC
      |AC
      |AC
      |AC
      |AC
      |AC
      |AC
      |AC""".stripMargin -> """AC x 10
                                  |WA x 0
                                  |TLE x 0
                                  |RE x 0
                                |""".stripMargin
  )

  def test():String= {
    return tests.map{case (i,o)=>(i.trim(),o.trim())}
      .zipWithIndex.map{
      case ((input,outputExpect),i)=>{
        val output=solve(input).trim();
        s"test${i+1}:"+(if(output==outputExpect){
          "Passed"
        }else{
          s"Failed\nexpect:\n${outputExpect}\noutput:\n${output}"
        })
      }}
      .mkString("\n");
  }



}