#include #include #include using namespace std; const int I = 1; const int V = 5; const int X = 10; const int L = 50; const int C = 100; const int D = 500; const int M = 1000; int parsechar(char c) { switch (c) { case 'i': return I; case 'v': return V; case 'x': return X; case 'l': return L; case 'c': return C; case 'd': return D; case 'm': return M; default: return 0; } } long parseroman(string s) { long out = 0; for (int i = 0; i < s.size(); i++) out += parsechar(s[i]); return out; } string parse(string s) { string out = ""; for (unsigned int i = 0; i < s.size(); i++) { char c = s[i]; if ((c == 'm') || (c == 'd') || (c == 'c') || (c == 'l') || (c == 'x') || (c == 'v') || (c == 'i')) out += c; } return out; } string simplify(string s) { string out = ""; int pos = s.size()-1; out += s[pos]; for (int i = s.size()-2; i >= 0; i--) { if (parsechar(s[i]) == parsechar(s[pos])) out += s[i]; else if (parsechar(s[i]) > parsechar(s[pos])) { out += s[i]; pos = i; } } return out; } string undupl(string s) { int i = 0; int v = 0; int x = 0; int l = 0; int c = 0; int d = 0; int m = 0; for (int j = 0; j < s.size(); j++) switch (s[j]) { case 'i': i++; break; case 'v': v++; break; case 'x': x++; break; case 'l': l++; break; case 'c': c++; break; case 'd': d++; break; case 'm': m++; break; } string out = ""; for (int j = 0; j < m; j++) out += 'm'; if (d >= 1) out += 'd'; for (int j = 0; (j < 3) && (j < c); j++) out += 'c'; if (l >= 1) out += 'l'; for (int j = 0; (j < 3) && (j < x); j++) out += 'x'; if (v >= 1) out += 'v'; for (int j = 0; (j < 3) && (j < i); j++) out += 'i'; return out; } int findnext(int pos, string s, char c) { pos++; while ((pos < s.size()) && (s[pos] != c)) pos++; if (pos >= s.size()) return -1; else return pos; } int main() { string line; char *c=NULL; size_t delka = 10000; while (getline(&c, &delka, stdin) != -1) { line = c; string rline = parse(line); string roman = simplify(rline); string out = undupl(roman); cout << parseroman(out) << endl; } }