1. 


/* Angewandte Mathematik, SS09, IFB 2C
* ACM Problem #759 (The Return of the Roman Empire)
* Link: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=9&page=show_problem&problem=700
*
* @author Dennis Wilfert
* @author Johann Studt
* @version 1.0, 05/12/2009
*
* Status : Accepted
* Runtime: 0.396
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;

public class Main {

public static void main(String[] args) throws IOException {

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

// Map mit Römischen Zahlen und dazugehörigen Dezimalzahlen
HashMap<Character, Integer> convert = new HashMap<Character, Integer>();
convert.put('I', 1);
convert.put('X', 10);
convert.put('C', 100);
convert.put('M', 1000);
convert.put('V', 5);
convert.put('L', 50);
convert.put('D', 500);

// Map mit gültigen negativen Werten
HashMap<String, Integer> digraph = new HashMap<String, Integer>();
digraph.put("IV", 4);
digraph.put("IX", 9);
digraph.put("XL", 40);
digraph.put("XC", 90);
digraph.put("CD", 400);
digraph.put("CM", 900);

// Array mit den römischen Zahlen
char[] roman;
// Ausgelesene Zeile
String str;
// StringBuilder für die Ausgabe
StringBuilder output = new StringBuilder();
// Letztes zeichen
char lastchar;
// Summe der Römischen Zahl im Dezimalsystem
int sum;
// Hilfsvariable zum feststellen ob aufeinanderfolgende gleiche Zeichen kommen
int num;
// Länge des Arrays
int length;
// Feststellen ob der letzte Wert größer war
boolean lastbigger;
// Feststellen ob die Aktuelle Zahl gültig ist
boolean valid;

while(true){

str = reader.readLine();
if(str == null)
break;

lastbigger = false;
num = 0;
valid = true;
roman = str.toCharArray();
length = roman.length;

// Ersten von hinten gelesen als Summe speichern
sum = convert.get(roman[length-1]);
lastchar = roman[length-1];

// Array von hinten nach vorne durchlaufen
for(int i = roman.length-2; i>=0; i--){

// Falls das letzte Zeichen gleich dem aktuellen ist
if(roman[i] == lastchar){
// Diese Zeichen dürfen nicht mehrfach nacheinander vorkommen
if(lastchar == 'V' || lastchar == 'L' || lastchar == 'D'){
output.append("This is not a valid number\n");
valid = false;
break;
}
else{
// Mehr als drei gleiche aufeinanderfolgende Zeichen sind nicht gültig
if(num==4){
output.append("This is not a valid number\n");
valid = false;
break;
}
num+=2;
}

}
else{
num=0;
}
// Aktuelles Wert ist kleiner als der vorhergehende
if(convert.get(roman[i]) < convert.get(lastchar))
{
if(i<length-2)
if(convert.get(roman[i]) < convert.get(roman[i+2]) || roman[i] == roman[i+2]){
output.append("This is not a valid number\n");
valid = false;
break;
}
if(!digraph.containsKey(roman[i] + "" + lastchar)){
output.append("This is not a valid number\n");
valid = false;
break;
}
// Von der Summe abziehen
sum -= convert.get(roman[i]);
// Wert ist kleiner als der letzte
lastbigger = true;
}

else{
// Vorletzter Wert war größer las der letzte
if(lastbigger){
if(num>0){
output.append("This is not a valid number\n");
valid = false;
break;
}
if(i<length-2){
if(convert.get(roman[i]) < convert.get(roman[i+2])){
output.append("This is not a valid number\n");
valid = false;
break;
}
if(roman[i] == 'V' || roman[i] == 'L' || roman[i] == 'D'){
if(roman[i] == roman[i+2]){
output.append("This is not a valid number\n");
valid = false;
break;
}
}
}

}
// Zur Summe addieren
sum += convert.get(roman[i]);
lastbigger = false;

}

lastchar = roman[i];
}
// Ist der Wert gültig, dann die Summe an die Ausgabe hängen
if(valid)
output.append(sum + "\n");


}
// Ausgeben
System.out.print(output);

}

}