import Text.Parsec n4 = do mn <- length <$> many (char 'M') n <- n3 return $ mn * 1000 + n n3 = try n31 <|> try n32 <|> n33 where n31 = string "CD" >> (+ 400) <$> n2 n32 = string "CM" >> (+ 900) <$> n2 n33 = do d <- length <$> many (char 'D') cn <- length <$> many (char 'C') n <- n2 return $ d * 500 + cn * 100 + n n2 = try n21 <|> try n22 <|> n23 where n21 = string "XL" >> (+ 40) <$> n1 n22 = string "XC" >> (+ 90) <$> n1 n23 = do l <- length <$> many (char 'L') xn <- length <$> many (char 'X') n <- n1 return $ l * 50 + xn * 10 + n n1 = try n11 <|> try n12 <|> n13 where n11 = string "IV" >> return 4 n12 = string "IX" >> return 9 n13 = do v <- length <$> many (char 'V') i_n <- length <$> many (char 'I') return $ v * 5 + i_n m x | x >= 4000 = "ERROR" | otherwise = s4 ++ s3 ++ s2 ++ s1 where [x1, x2, x3, x4] = take 4 $ map (`mod` 10) (iterate (`div` 10) x) ++ replicate 4 0 f u1 u2 u3 x = if x == 9 then [u1, u3] else if x >= 5 then u2 : replicate (x - 5) u1 else if x == 4 then [u1, u2] else replicate x u1 s4 = replicate x4 'M' s3 = f 'C' 'D' 'M' x3 s2 = f 'X' 'L' 'C' x2 s1 = f 'I' 'V' 'X' x1 main = do _ <- getLine rs <- words <$> getLine let parse' :: String -> Int parse' y = case parse n4 "" y of Left _ -> undefined Right n -> n let s = sum $ map parse' rs putStrLn $ m s