def isEmpty
= items.
isEmpty case n
=> items.
updated ( item, n -
1 ) } )
}
def apply
[ E
] ( items
: Traversable
[ E
] ) : Bag
[ E
] = { val itemCounts
= mutable.
HashMap .
empty [ E, Int
] .
withDefaultValue ( 0 ) items.foreach ( itemCounts( _ ) += 1 )
}
}
type Solution
= Option
[ Seq
[ ( String, String
) ] ]
def solve
( items
: Bag
[ String
] , anagrams
: String, matches
: Solution
= None
) : Solution
= if ( items.
isEmpty ) matches
item < - items.view
( label, rest) = anagrams.splitAt ( item.length )
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
] ]
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=
stdin
YWJjYWJjIGFiYyBiYyBhYmMgYWJjYWJjIGFiYyBiYyBhYmMgYWJjYWJjIGFiYyBiYyBhYmMgYWJjYWJjIGFiYyBiYyBhYmMgYWJjYWJjIGFiYyBiYyBhYmMKYWJjYWJjYWJjYmNhYmNhYmNhYmNhYmNiY2FiY2FiY2FiY2FiY2JjYWJjYWJjYWJjYWJjYmNhYmNhYmNhYmNhYmNiY2FiYw==
abcabc abc bc abc abcabc abc bc abc abcabc abc bc abc abcabc abc bc abc abcabc abc bc abc
abcabcabcbcabcabcabcabcbcabcabcabcabcbcabcabcabcabcbcabcabcabcabcbcabc