Submission #3336727


Source Code Expand

import collection.mutable
import scala.collection.mutable.ListBuffer

object Main {
  def main(args: Array[String]): Unit = {
    import scala.io.StdIn.readLine
    val Array(n, m) = readLine().split(" ").map(_.toInt)
    val cnf = CNF(readLine())
    val assignment = Assignment(readLine().map(_ == 'T'))

    val varToClauseIndexes = {
      val builder = mutable.Map[Var, mutable.ListBuffer[Int]]()
      builder ++= (0 until n).map(i => i -> ListBuffer[Int]())
      for {
        (c, i) <- cnf.zipWithIndex
        v <- c.vars
      } {
        builder(v) += i
      }
      builder.toMap.mapValues(seq => mutable.BitSet() ++= seq)
    }

    val falseCaluseIndexes = mutable.BitSet() ++= cnf.zipWithIndex.flatMap{
      case (c, i) if !c.test(assignment) => Some(i)
      case _ => None
    }

    def count(vars: Set[Var], falseSet: mutable.BitSet): Int = {
      if (vars.size > 10) return Int.MaxValue
      if (falseSet.isEmpty) return vars.size

      cnf(falseSet.head).vars.filterNot(vars.contains).map(v => {
        count(vars + v, falseSet ^ varToClauseIndexes(v))
      }) match {
        case list if list.isEmpty => Int.MaxValue
        case list => list.min
      }
    }

    val result = count(Set(), falseCaluseIndexes)
    if (result == Int.MaxValue) println("TOO LARGE") else println(result)
  }

  type CNF = IndexedSeq[Clause]
  type Var = Int

  case class Clause(left: Literal, right: Literal) {
    def test(assignment: Assignment): Boolean = {
      left.test(assignment) || right.test(assignment)
    }

    def vars = Seq(left.i, right.i)
  }

  case class Literal(i: Var, tilde: Boolean) {
    def test(assignment: Assignment): Boolean = {
      if (tilde) !assignment.list(i) else assignment.list(i)
    }
  }

  object CNF {
    def apply(str: String): CNF = {
      str.split("\\^").map(s => Clause(s))
    }
  }

  object Clause {
    def apply(str: String): Clause = {
      val Array(left, right) = str.slice(1, str.length - 1).split("v")
      Clause(Literal(left), Literal(right))
    }
  }

  object Literal {
    def apply(str: String): Literal = {
      str.split("~") match {
        case Array(x) => new Literal(x.toInt - 1, false)
        case Array("", x) => new Literal(x.toInt - 1, true)
      }
    }
  }

  case class Assignment(list: IndexedSeq[Boolean]) {
    def *(set: Set[Int]): Assignment = {
      val arr = list.toArray
      set.foreach(i => arr(i) = !arr(i))
      Assignment(arr.toIndexedSeq)
    }
  }

}

Submission Info

Submission Time
Task E - 2-SAT
User tsuba3
Language Scala (2.11.7)
Score 0
Code Size 2561 Byte
Status WA
Exec Time 2111 ms
Memory 154744 KB

Judge Result

Set Name All
Score / Max Score 0 / 200
Status
AC × 26
WA × 15
TLE × 12
Set Name Test Cases
All 00-sample-00, 00-sample-10, 00-sample-20, 10-sat-00, 10-sat-01, 10-sat-02, 10-sat-03, 10-sat-04, 10-sat-05, 10-sat-06, 10-sat-07, 10-sat-08, 10-sat-09, 10-sat-10, 10-sat-11, 10-sat-12, 10-sat-13, 10-sat-14, 10-sat-15, 10-sat-16, 10-sat-17, 10-sat-18, 10-sat-19, 10-sat-20, 10-sat-21, 10-sat-22, 10-sat-23, 10-sat-24, 10-sat-25, 10-sat-26, 10-sat-27, 10-sat-28, 10-sat-29, 10-sat-30, 10-sat-31, 10-sat-32, 10-sat-33, 10-sat-34, 10-sat-35, 10-sat-36, 10-sat-37, 10-sat-38, 10-sat-39, 20-unsat-00, 20-unsat-01, 20-unsat-02, 20-unsat-03, 20-unsat-04, 20-unsat-05, 20-unsat-06, 20-unsat-07, 20-unsat-08, 20-unsat-09
Case Name Status Exec Time Memory
00-sample-00 AC 330 ms 25284 KB
00-sample-10 AC 333 ms 25268 KB
00-sample-20 AC 542 ms 27588 KB
10-sat-00 AC 1189 ms 45620 KB
10-sat-01 AC 1062 ms 44900 KB
10-sat-02 AC 1488 ms 79492 KB
10-sat-03 AC 1244 ms 47408 KB
10-sat-04 WA 1812 ms 145144 KB
10-sat-05 WA 1354 ms 61800 KB
10-sat-06 WA 1703 ms 128676 KB
10-sat-07 WA 1536 ms 86544 KB
10-sat-08 WA 1696 ms 127796 KB
10-sat-09 WA 1433 ms 57888 KB
10-sat-10 WA 1676 ms 126924 KB
10-sat-11 WA 1536 ms 89416 KB
10-sat-12 WA 1958 ms 148828 KB
10-sat-13 WA 1792 ms 140372 KB
10-sat-14 WA 1925 ms 154744 KB
10-sat-15 WA 1346 ms 59240 KB
10-sat-16 TLE 2002 ms 144184 KB
10-sat-17 WA 1177 ms 55072 KB
10-sat-18 TLE 2060 ms 146648 KB
10-sat-19 WA 1586 ms 130540 KB
10-sat-20 TLE 2103 ms 146472 KB
10-sat-21 WA 1422 ms 59084 KB
10-sat-22 AC 1911 ms 144808 KB
10-sat-23 AC 1451 ms 76444 KB
10-sat-24 TLE 2037 ms 146480 KB
10-sat-25 AC 1784 ms 141704 KB
10-sat-26 TLE 2111 ms 146544 KB
10-sat-27 AC 1483 ms 93028 KB
10-sat-28 TLE 2105 ms 147028 KB
10-sat-29 AC 1368 ms 75448 KB
10-sat-30 TLE 2079 ms 147368 KB
10-sat-31 AC 1351 ms 79048 KB
10-sat-32 TLE 2083 ms 145448 KB
10-sat-33 AC 1519 ms 82044 KB
10-sat-34 TLE 2025 ms 147448 KB
10-sat-35 AC 1411 ms 55208 KB
10-sat-36 AC 1985 ms 147116 KB
10-sat-37 AC 1240 ms 46568 KB
10-sat-38 TLE 2101 ms 148724 KB
10-sat-39 AC 1316 ms 63956 KB
20-unsat-00 AC 1984 ms 143556 KB
20-unsat-01 AC 1629 ms 131008 KB
20-unsat-02 TLE 2059 ms 149724 KB
20-unsat-03 AC 1328 ms 50740 KB
20-unsat-04 AC 1998 ms 146088 KB
20-unsat-05 AC 1392 ms 56748 KB
20-unsat-06 TLE 2042 ms 145980 KB
20-unsat-07 AC 1813 ms 143636 KB
20-unsat-08 AC 1950 ms 143904 KB
20-unsat-09 AC 1630 ms 113456 KB