import qualified Data.Set as S main :: IO () main = interact $ show . S.size . solve . tail . reverse solve :: String -> S.Set String solve s = solve' ("", s) where solve' (str, "") = S.singleton str solve' (str, rest) = let rest' = reverse rest in S.union (solve' (head rest:str, tail rest)) (solve' (head rest':str, tail rest'))