#include #include #include using namespace std; const int MAX = 50; struct info { int list[5001]; int start, size; } grid[MAX+1][MAX+1]; // grid[start location][length] int value(char ch) { switch (ch) { case 'I': return 1; case 'V': return 5; case 'X': return 10; case 'L': return 50; case 'C': return 100; default : cout << "ERROR: invalid character" << endl; } return 0; } void clear(info & g) { for(int i=0; i<=5000; i++) g.list[i] = -1; g.start = 0; g.size = 0; } void insert(int val, info& g) { if (g.list[val] != -1) return; g.list[val] = g.start; g.start = val; g.size++; } void merge(int start, int len, const info & list1, const info & list2) { for(int i = list1.start; i > 0; i = list1.list[i]) { for(int j = list2.start; j > 0; j = list2.list[j]) { if (i >= j) insert(i+j,grid[start][len]); else insert(j-i,grid[start][len]); } } } int main() { int icase=0; string s; cin >> s; while (s != "0") { icase++; int n = s.length(); for(int j=0; j a; for(int i = grid[0][n].start; i > 0; i = grid[0][n].list[i]) a.push_back(i); sort(a.begin(), a.end()); for(int i=0; i> s; } }