import Control.Applicative import Data.Map import Data.List import Data.Maybe upd k v = insertWithKey (\k x y -> x + y) k v get k mp = fromMaybe 0 $ Data.Map.lookup k mp dfs :: Int -> String -> (Map [Int] Int) -> Int dfs i [] dp = get [i, 3] dp dfs i (s : ss) dp = dfs (i + 1) ss $ upd [i + 1, 0] (get [i, 0] dp) . upd [i + 1, 1] (get [i, 1] dp) . upd [i + 1, 2] (get [i, 2] dp) . upd [i + 1, 3] (get [i, 3] dp) . (if s == 'c' then upd [i + 1, 1] (get [i, 0] dp) else id) . (if s == 'w' then upd [i + 1, 2] (get [i, 1] dp) else id) . (if s == 'w' then upd [i + 1, 3] (get [i, 2] dp) else id) $ dp main = do s <- getLine let n = length s print $ dfs 0 s $ upd [0, 0] 1 Data.Map.empty