Go: package main

import (
	"bufio"
	"os"
	"strings"
	"fmt"
)

var scanner = bufio.NewScanner(os.Stdin)

func main() {
	dict := make(map[string]int)
	dict[" "] = 0
	dict["I"] = 1
	dict["V"] = 5
	dict["X"] = 10
	dict["L"] = 50
	dict["C"] = 100
	dict["D"] = 500
	dict["M"] = 1000
	for scanner.Scan() {
		line := strings.Split(scanner.Text(), "")
		line = append(line, " ")
		sum := 0
		for i := 0; i < len(line)-1; i++ {
			if dict[line[i]] < dict[line[i+1]] {
				sum -= dict[line[i]]
			} else {
				sum += dict[line[i]]
			}
		}
		fmt.Println(sum)
	}
}

C++: #include "bits/stdc++.h"

#define REP(i,num) for(int i=0;i<(num);++i)
#define LOOP(i) while(i--)
#define ALL(c) c.begin(),c.end()
#define PRINTALL(c) for(auto& x:c){cout<<x<<' ';}cout<<endl;
#define PAIRCOMP(c,comp) [](const pair<ll,ll>& lhs,const pair<ll,ll>& rhs){return lhs.c comp rhs.c;}

using namespace std;
using ll = long long;

constexpr ll atcoder_mod = 1e9+7;

template<typename T=int>
T in(){T x; cin >> x; return (x);}
template<typename T=int,typename C=vector<T>>
C vecin(int N){C x(N);REP(i,N){x[i]=in<T>();}return move(x);}

void vout(){cout << endl;}
template<typename Head,typename... Tail>
void vout(Head&& h,Tail&&... t){cout << ' ' << h;vout(forward<Tail>(t)...);}
void out(){cout << endl;}
template<typename Head,typename... Tail>
void out(Head&& h,Tail&&... t){cout << h;vout(forward<Tail>(t)...);}

int main(){
	cin.tie(0);
	ios::sync_with_stdio(false);
	
	map<char,int> M;
	M['I'] = 1;
	M['V'] = 5;
	M['X'] = 10;
	M['L'] = 50;
	M['C'] = 100;
	M['D'] = 500;
	M['M'] = 1000;

	string S;
	while(cin>>S){
		int sum = 0;
		int N=S.size();
		
		for(int i=0;i<N;){
			if(i<N-1 && M[S[i]]<M[S[i+1]]){
				sum += M[S[i+1]]-M[S[i]];
				i+=2;
			}
			else{
				sum += M[S[i]];
				i++;
			}
		}
		out(sum);
	}
	return 0;
}

C++: #include<iostream>
#include<string>

using namespace std;

/*
各記号の意味
 I:1, V:5, X:10, L:50, C:100, D:500, M:1000

 規則
 小さい数字が大きい数字の後に続いている。(右側にある)
 　→足し算する

 小さい数字が大きい数字の前にある。(左側)
 　→一つだけ引き算をする。
 
 方法
  基本的には前から順番に足し算していく。
  引き算が発生するのは1つ前の値が小さい場合だけ。
  一文字ずつチェックするときに前の値を記録しておき、
  小さければ引き算、それ以外ならその値を足していく。
*/

int roman_to_number(char roman){
	switch (roman) {
	case 'I':
		return 1;
	case 'V':
		return 5;
	case 'X':
		return 10;
	case 'L':
		return 50;
	case 'C':
		return 100;
	case 'D':
		return 500;
	case 'M':
		return 1000;
	default:
		// その他の数字の場合入力にエラーがある。
		// このプログラムでは例外を投げて対処しない。
		throw -1;
	}
}

int main() {
	string line;
	while (cin >> line) {
		int sum = 0;
		int temp = 0;
		for (auto c : line) {
			int num = roman_to_number(c);
			if (temp == 0) {
				//初回 or 前回引き算の処理をしている。
				temp = num;
			}
			else if (num > temp) {
				// 前回の値が今回の値より小さいとき、
				// 前回の値を今回の値から引いた値を合計に足す
				// 今回の値は合計値に利用するためtempは0にしておく
				sum += num - temp;
				temp = 0;
			}
			else {
				// 前回の値が今回の値以上の場合、前回の値を合計値に足す。
				// 今回の値は次回の値チェックで使用するためtempに記録
				sum += temp;
				temp = num;
			}
		}
		// 最後にチェックした時に引き算でないと合計値が確定していないため、値を加算しておく。
		sum += temp;

		cout << sum << endl;
	}

	return 0;
}

C++: #include<cstdio>
#include<algorithm>
#include<vector>
#include<string>
#include<iostream>
#include<queue>
#include<map>
#include<set>
#include<complex>
#include<stack>
#include<cmath>

using namespace std;

#define reps(i,f,n) for(int i=f;i<int(n);i++)
#define rep(i,n) reps(i,0,n)


int main(){
	
	int m[300];
	m['I']=1;
	m['V']=5;
	m['X']=10;
	m['L']=50;
	m['C']=100;
	m['D']=500;
	m['M']=1000;
	string s;
	while(cin>>s){
		s+='#';
	int sum = 0;
		reps(i,1,s.size()){
			if(s[i]!='#' && m[s[i]]>m[s[i-1]]){
				sum -= m[s[i-1]];
			}else{
				sum += m[s[i-1]];
			}
		}
		printf("%d\n",sum);
	}
}

C++: #include <string>
#include <iostream>
using namespace std;
int a[100]; string s;
int main() {
	while(cin >> s) {
		int n = s.size();
		for(int i = 0; i < n; i++) {
			switch(s[i]) {
				case 'I': a[i] = 1; break;
				case 'V': a[i] = 5; break;
				case 'X': a[i] = 10; break;
				case 'L': a[i] = 50; break;
				case 'C': a[i] = 100; break;
				case 'D': a[i] = 500; break;
				case 'M': a[i] = 1000; break;
			}
		}
		int ret = 0;
		for(int i = 0; i < n - 1; i++) {
			if(a[i] >= a[i + 1]) ret += a[i];
			else ret -= a[i];
		}
		printf("%d\n", ret + a[n - 1]);
	}
	return 0;
}

C++: #include <stdio.h>
#include <string>

char c[200];

int main(){
	int ans;
	int n;
	while(scanf("%s",&c) != EOF){
		n = strlen(c);
		ans = 0;
		for(int i = 0; i < n; i++){
			if(c[i] == 'I'){
				if(c[i + 1] == 'V' || c[i + 1] == 'X'){
					ans -= 1;
				}else{
					ans += 1;
				}
			}
			if(c[i] == 'X'){
				if(c[i + 1] == 'L' || c[i + 1] == 'C'){
					ans -= 10;
				}else{
					ans += 10;
				}
			}
			if(c[i] == 'C'){
				if(c[i + 1] == 'D' || c[i + 1] == 'M'){
					ans -= 100;
				}else{
					ans += 100;
				}
			}
			if(c[i] == 'V'){
				ans += 5;
			}
			if(c[i] == 'L'){
				ans += 50;
			}
			if(c[i] == 'D'){
				ans += 500;
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}

C++: #include<iostream>
#include<string>
#include<map>
using namespace std;
 
int main()
{
    string str;
    while(cin >> str)
    {
        int s = 0;
        for(int i = 0; i < str.size(); i++)
        {
            char c = str[i];
            char next = (i==str.size()-1 ? 0 : str[i+1]);
            switch(c)
            {
            case 'I': 
                if(next == 'V') s += 4, i++;
                else if(next == 'X') s += 9, i++;
                else s+=1;
                break;
            case 'V':
                s += 5;
                break;
            case 'X':
                if(next == 'L') s += 40, i++;
                else if(next== 'C') s += 90, i++;
                else s+=10;
                break;
            case 'L':
                s += 50;
                break;
            case 'C':
                if(next == 'D') s += 400, i++;
                else if(next =='M') s += 900, i++;
                else s += 100;
                break;
            case 'D':
                s += 500;
                break;
            case 'M':
                s += 1000;
                break;
            }
        }
        cout << s << endl;
    }
    return 0;
}

C++: #include <iostream>
#include <string>
using namespace std;

int index(char c){
	if(c == 'A') return 0;
	if(c == 'I') return 1;
	if(c == 'V') return 5;
	if(c == 'X') return 10;
	if(c == 'L') return 50;
	if(c == 'C') return 100;
	if(c == 'D') return 500;
	if(c == 'M') return 1000;
}
int main(){
	string s;
	while(cin >> s){
		int total = 0;
		int size = s.size();
		s.push_back('A');
		for(int i = 0; i < size;i++)
		{
			if(index(s[i]) < index(s[i+1])) total -= index(s[i]);
			else total += index(s[i]);
		}
		cout << total << endl;
	}
	return 0;
}

C++: #include<iostream>
#include<vector>
#include<string>
using namespace std;

int get_arabic(char x){
  if(x=='I')return 1;
  else if(x=='V')return 5;
  else if(x=='X')return 10;
  else if(x=='L')return 50;
  else if(x=='C')return 100;
  else if(x=='D')return 500;
  else if(x=='M')return 1000;
}

int roma_to_arabic(string roma){
  int nums[100];
  for(int i=0;i<roma.length();i++){
    nums[i]=get_arabic(roma[i]);
  }
  for(int i=0;i<roma.length();i+=2){
    if(nums[i]>=nums[i+1])nums[i]=nums[i]+nums[i+1];
    else if(nums[i]<nums[i+1])nums[i]=nums[i+1]-nums[i];
  }

  int retu=0;
  for(int i=0;i<roma.length();i+=2){
    retu+=nums[i];
  }
  return retu;
}
int main(){
  vector<int> answers;
  string roma_num;
  while(cin>>roma_num){
    answers.push_back(roma_to_arabic(roma_num));
  }
  for(int i=0;i<answers.size();i++){
    cout<<ansers[i]<<endl;
  }
}