fork download
import Data.List
import Data.Function

main = fmap lines getContents >>= \[predmeti,birki] -> let
	(predmeti',birki') = unzip $ head $ soljushen sgruppirovaniePredmeti birki
	sgruppirovaniePredmeti = groupBy ((==) `on` sort) $ sortBy (compare `on` sort) $ words predmeti
	in mapM_ (putStrLn . unwords) [predmeti',birki']
	
soljushen _ [] = [[]]
soljushen gruppi birki = [(birka,predmet):solushn | 
	(levo,(predmet:gruppa):pravo) <- zip (inits gruppi) (tails gruppi),
	let birka = zipWith const birki predmet,
	sort predmet == sort birka,
	solushn <- soljushen (levo++gruppa:pravo) (birki\\birka)]
Success #stdin #stdout 0s 6296KB
stdin
abc abcd abcjk
abcjkdabcabc
stdout
abcjk dabc abc
abcjk abcd abc