intさわだんのBlack History

刹那的レジェンドになりたい。

ICPC 国内予選2005C Numeral System AOJ1137

やるだけ

map<char,int>が使えれば楽なのだがやり方よくわからなかったので断念して配列でやった。(しかたなくmap<string,int>も試してみたが闇だった。

#include <bits/stdc++.h>
#include <map>
#define chmin(a, b) ((a)=min((a), (b)))
#define chmax(a, b) ((a)=max((a), (b)))
#define fs first
#define sc second
#define eb emplace_back
using namespace std;
 
typedef long long ll;
typedef pair<int, int> P;
typedef tuple<int, int, int> T;
 
const ll MOD=1e9+7;
const ll INF=1e18;
 
int dx[]={1, -1, 0, 0};
int dy[]={0, 0, 1, -1};


char num[] = {'0','1','2','3','4','5','6','7','8','9'};
char mcxi[] = {'m','c','x','i'};
int mcxi2[] = {1000,100,10,1};


int sum[2];

int main(){


    int n;
    cin >> n;
    for(int iii = 0;iii < n;iii++){
        char inp[2][12];
        cin >> inp[0] >> inp[1];
        for(int k = 0;k < 2;k++){
            sum[k] = 0;
            for(int i = 0;i < strlen(inp[k]);i++){
                int flag = 0;
                for(int j = 2;j <= 9;j++){
                    if(num[j] == inp[k][i]){
                        flag = j;
                        break;
                    }
                }
                if(flag == 0){
                    flag = 1;
                }else{
                    i++;
                }
                for(int j = 0;j < 4;j++){
                    if(inp[k][i] == mcxi[j]){
                        sum[k] += flag * mcxi2[j];
                        break;
                    }
                }
            }
   //         cout << sum[k] << endl;
        }
        int s = sum[0] + sum[1];
        for(int i = 0;i < 4;i++){
            if(s / mcxi2[i] > 1) cout << s/mcxi2[i];
            if(s / mcxi2[i] >= 1) cout << mcxi[i];
            s %= mcxi2[i];
        }
        cout << endl;
        

    }
}