AOJ1617: Almost Identical Programs

問題

問題文

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1617&lang=jp

問題概要

2つの文字列が与えられる.

2つが完全に等しければ, IDENTICAL と 2つのプログラム中の対応する文字列定数1つだけが異なるならば CLOSE と それ以外の場合,DIFFERENT と出力せよ.

文字列定数とは, 奇数番目の二重引用符とその次の二重引用符の間の文字の並びである.

文字列定数は空文字もあり得る. また, 二重引用符は必ず偶数個含まれ奇数個となることはない.

解答例

指針

  • まず文字列定数の数が等しいかどうかを判定する.

解説

講評にも書いてある通り, やるべきことは明確である.

まず文字列定数の数が等しいかどうかを判定すると楽に実装できる.

与えられた文字列を文字列定数とそれ以外の文字列とに分解するには Python の split メソッドを用いると楽である.

C++ には Python の split メソッドに相当するものがないので自前でそれっぽいものを実装する必要がある.

def solve(s, t):
    s = s.split('"')
    t = t.split('"')

    if s == t:
        return "IDENTICAL"

    if len(s) == len(t):
        cnt = 0
        for i in range(len(s)):
            if s[i] != t[i] and i % 2 == 1:
                cnt += 1
            elif s[i] != t[i]:
                cnt += 2
        if cnt == 1:
            return 'CLOSE'

    return 'DIFFERENT'


while True:
    s1 = raw_input()

    if s1 == '.': break

    s2 = raw_input()

    print solve(s1, s2)
  • C++ による実装例
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main() {
    int cnt;
    string s1, s2, tmp;
    vector<string> sv1, sv2;

    while (cin >> s1) {
        if (s1 == ".") { break; }

        cin >> s2;

        sv1.clear(); sv2.clear();

        tmp = ""; cnt = 0;

        if (s1 == s2) { cout << "IDENTICAL" << endl; }
        else {
            for (int i = 0; i < s1.size()+1; i++) {
                if (s1[i] != '"' && i != s1.size()) { tmp += s1[i]; }
                else { sv1.push_back(tmp); tmp = ""; }
            }
            for (int i = 0; i < s2.size()+1; i++) {
                if (s2[i] != '"' && i != s2.size()) { tmp += s2[i]; }
                else { sv2.push_back(tmp); tmp = ""; }
            }
            if (sv1.size() != sv2.size()) { cnt += 2; }
            else {
                for (int i = 0; i < sv1.size(); i++) {
                    if (sv1[i] != sv2[i] && i % 2 == 1) { cnt++; }
                    else if (sv1[i] != sv2[i]) { cnt += 2; break; }
                }
            }
            cout << ((cnt == 1) ? "CLOSE" : "DIFFERENT") << endl;
        }
    }
    return 0;
}

参考文献