{-# LANGUAGE BangPatterns, FlexibleContexts #-} import Control.Applicative import Control.Monad import Data.List import Debug.Trace (traceShow, traceShowM) import qualified Data.ByteString.Char8 as B import Data.Maybe import Control.Monad.ST import Data.Array.ST inf :: Int inf = 10 ^ 9 + 7 solve n m ss ts = runST $ do dp <- newArray ((0, 0), (n, m)) inf :: ST s (STUArray s (Int, Int) Int) writeArray dp (0, 0) 0 forM_ [0 .. n] $ \i -> do forM_ [0 .. m] $ \j -> do v1 <- if all (>= 1) [i, j] then Just <$> readArray dp (i - 1, j - 1) else return Nothing v2 <- if i >= 1 then Just <$> readArray dp (i - 1, j) else return Nothing v3 <- if j >= 1 then Just <$> readArray dp (i, j - 1) else return Nothing let vs = catMaybes [v1, v2, v3] when (not $ null vs) $ do if isJust v1 then do if (ss `B.index` (i - 1)) == (ts `B.index` (j - 1)) then writeArray dp (i, j) (minimum $ [fromJust v1] ++ fmap (+ 1) (catMaybes [v2, v3])) else writeArray dp (i, j) (minimum vs + 1) else writeArray dp (i, j) (minimum vs + 1) readArray dp (n, m) main :: IO () main = do [n, m] <- fmap read . words <$> getLine :: IO [Int] ss <- B.getLine ts <- B.getLine print $ solve n m ss ts