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 :: String -> (Map Int Int) -> Int dfs [] dp = get 3 dp dfs (s : ss) dp = dfs ss $ upd 0 (get 0 dp) . upd 1 (get 1 dp) . upd 2 (get 2 dp) . upd 3 (get 3 dp) . (if s == 'c' then upd 1 (get 0 dp) else id) . (if s == 'w' then upd 2 (get 1 dp) else id) . (if s == 'w' then upd 3 (get 2 dp) else id) $ Data.Map.empty main = do s <- getLine let n = length s print $ dfs s $ upd 0 1 Data.Map.empty