import scala.collection._
class Bag[E] private (val items: Map[E, Int]) {
def isEmpty = items.isEmpty
def view = items.keys
def -(item: E) = new Bag[E](items(item) match {
case 1 => items - item
case n => items.updated(item, n - 1)
})
}
object Bag {
def apply[E](items: Traversable[E]): Bag[E] = {
val itemCounts = mutable.HashMap.empty[E, Int].withDefaultValue(0)
items.foreach(itemCounts(_) += 1)
new Bag[E](itemCounts)
}
}
object Main extends App {
type Solution = Option[Seq[(String, String)]]
def solve(items: Bag[String], anagrams: String, matches: Solution = None): Solution =
if (items.isEmpty) matches
else (for {
item <- items.view
(label, rest) = anagrams.splitAt(item.length)
if item == label.sorted
newMatches = Option(matches.getOrElse(immutable.Queue.empty) :+ (item, label))
solution <- solve(items - item, rest, newMatches)
} yield solution).headOption
val items = readLine().split(" ")
val anagrams = readLine()
val sortedItems = mutable.Buffer.empty[String]
val itemOrderRestorator = mutable.Map.empty[String, mutable.Queue[String]]
for (item <- items) {
val sorted = item.sorted
sortedItems += sorted
itemOrderRestorator.getOrElseUpdate(sorted, new mutable.Queue).enqueue(item)
}
solve(Bag(sortedItems), anagrams).map(_.unzip) match {
case None => println("Ne fart")
case Some((items, labels)) =>
println(labels.mkString(" "))
items.foreach(s => print(itemOrderRestorator(s).dequeue() + " "))
}
}
aW1wb3J0IHNjYWxhLmNvbGxlY3Rpb24uXwoKY2xhc3MgQmFnW0VdIHByaXZhdGUgKHZhbCBpdGVtczogTWFwW0UsIEludF0pIHsKICBkZWYgaXNFbXB0eSA9IGl0ZW1zLmlzRW1wdHkKICBkZWYgdmlldyA9IGl0ZW1zLmtleXMKICBkZWYgLShpdGVtOiBFKSA9IG5ldyBCYWdbRV0oaXRlbXMoaXRlbSkgbWF0Y2ggewogICAgY2FzZSAxID0+IGl0ZW1zIC0gaXRlbQogICAgY2FzZSBuID0+IGl0ZW1zLnVwZGF0ZWQoaXRlbSwgbiAtIDEpCiAgfSkKfQoKb2JqZWN0IEJhZyB7CiAgZGVmIGFwcGx5W0VdKGl0ZW1zOiBUcmF2ZXJzYWJsZVtFXSk6IEJhZ1tFXSA9IHsKICAgIHZhbCBpdGVtQ291bnRzID0gbXV0YWJsZS5IYXNoTWFwLmVtcHR5W0UsIEludF0ud2l0aERlZmF1bHRWYWx1ZSgwKQogICAgaXRlbXMuZm9yZWFjaChpdGVtQ291bnRzKF8pICs9IDEpCiAgICBuZXcgQmFnW0VdKGl0ZW1Db3VudHMpCiAgfQp9CgpvYmplY3QgTWFpbiBleHRlbmRzIEFwcCB7CiAgdHlwZSBTb2x1dGlvbiA9IE9wdGlvbltTZXFbKFN0cmluZywgU3RyaW5nKV1dCgogIGRlZiBzb2x2ZShpdGVtczogQmFnW1N0cmluZ10sIGFuYWdyYW1zOiBTdHJpbmcsIG1hdGNoZXM6IFNvbHV0aW9uID0gTm9uZSk6IFNvbHV0aW9uID0KICAgIGlmIChpdGVtcy5pc0VtcHR5KSBtYXRjaGVzCiAgICBlbHNlIChmb3IgewogICAgICBpdGVtIDwtIGl0ZW1zLnZpZXcKICAgICAgKGxhYmVsLCByZXN0KSA9IGFuYWdyYW1zLnNwbGl0QXQoaXRlbS5sZW5ndGgpCiAgICAgIGlmIGl0ZW0gPT0gbGFiZWwuc29ydGVkCiAgICAgIG5ld01hdGNoZXMgPSBPcHRpb24obWF0Y2hlcy5nZXRPckVsc2UoaW1tdXRhYmxlLlF1ZXVlLmVtcHR5KSA6KyAoaXRlbSwgbGFiZWwpKQogICAgICBzb2x1dGlvbiA8LSBzb2x2ZShpdGVtcyAtIGl0ZW0sIHJlc3QsIG5ld01hdGNoZXMpCiAgICB9IHlpZWxkIHNvbHV0aW9uKS5oZWFkT3B0aW9uCgogIHZhbCBpdGVtcyA9IHJlYWRMaW5lKCkuc3BsaXQoIiAiKQogIHZhbCBhbmFncmFtcyA9IHJlYWRMaW5lKCkKCiAgdmFsIHNvcnRlZEl0ZW1zID0gbXV0YWJsZS5CdWZmZXIuZW1wdHlbU3RyaW5nXQogIHZhbCBpdGVtT3JkZXJSZXN0b3JhdG9yID0gbXV0YWJsZS5NYXAuZW1wdHlbU3RyaW5nLCBtdXRhYmxlLlF1ZXVlW1N0cmluZ11dCgogIGZvciAoaXRlbSA8LSBpdGVtcykgewogICAgdmFsIHNvcnRlZCA9IGl0ZW0uc29ydGVkCiAgICBzb3J0ZWRJdGVtcyArPSBzb3J0ZWQKICAgIGl0ZW1PcmRlclJlc3RvcmF0b3IuZ2V0T3JFbHNlVXBkYXRlKHNvcnRlZCwgbmV3IG11dGFibGUuUXVldWUpLmVucXVldWUoaXRlbSkKICB9CgogIHNvbHZlKEJhZyhzb3J0ZWRJdGVtcyksIGFuYWdyYW1zKS5tYXAoXy51bnppcCkgbWF0Y2ggewogICAgY2FzZSBOb25lID0+IHByaW50bG4oIk5lIGZhcnQiKQogICAgY2FzZSBTb21lKChpdGVtcywgbGFiZWxzKSkgPT4KICAgICAgcHJpbnRsbihsYWJlbHMubWtTdHJpbmcoIiAiKSkKICAgICAgaXRlbXMuZm9yZWFjaChzID0+IHByaW50KGl0ZW1PcmRlclJlc3RvcmF0b3IocykuZGVxdWV1ZSgpICsgIiAiKSkKICB9Cn0=