import Control.Applicative import Control.Monad import Data.List import Data.Maybe import Debug.Trace calc :: String -> Int calc s = minimum $ map fst $ concatMap (\ (dis,str) -> mapMaybe (diffstr "problem" dis) $ tails str ) $ mapMaybe (diffstr "good" 0) $ tails s where diffstr :: String -> Int -> String -> Maybe (Int,String) diffstr "" distance srcstr = Just (distance,srcstr) diffstr _ _ "" = Nothing diffstr targetstr@(x:xs) distance srcstr@(y:ys) | x == y = trace (show (1,targetstr,distance,srcstr)) $ diffstr xs distance ys | otherwise = trace (show (2,targetstr,distance,srcstr)) $ diffstr xs (distance+1) ys main = do _:sl <- lines <$> getContents mapM_ (print . calc) sl