WARush

SRMの結果とか、解けた問題のコードを書いていきます

Codeforces #173 Div2 C "XOR and OR"

問題

ビット列とそれに対して行う以下ようなの操作がある。

  • 隣り合う2つのビットを選ぶ。以下(x,y)とする
  • p = x or y q = x xor y というpとqを求める。
  • xをpとqどちらかと置換する。
  • yはもう一方(xがpだったらq,qだったらp)と置換する。

2つビット列a,bが与えられるので、上記の操作を0回以上行う事によって
aをbに変換できるかどうかを返せ。

制約

1 <= a,bのビット長 <= 10^6

考えた事

まずビット長が違えばダメ

1がまったく無ければ1を生み出せない。
逆に1があれば、1を完全になくす事はできない。

そもそもビット長が1なら操作ができない。

場合漏れに注意しなきゃ・・・

事後

他の人と比べ、ソースコードが冗長だった。
ビット長と1の有無を比べるだけ、と上手くまとめられれば
判定部分を1行でやれるのね。

ソースコード
int main() {
    //ifstream in( "data.txt" );
    istream& in = cin;

    string a, b;
    in >> a >> b;
    
    // 文字数が違えばダメ
    if( a.length() != b.length() ){
        cout << "NO" << endl;
        return 0;
    }

    // 一文字だけ
    if( a.length() == 1 ){
        if( a[0] == b[0] ){
            cout << "YES" << endl;
        }else{
            cout << "NO" << endl;
        }
        return 0;
    }

    // aに1が一個もない場合、bに1があったらダメ
    if( a.find("1") == -1 ){
        if( b.find("1") == -1 ){
            cout << "YES" << endl;
        }else{
            cout << "NO" << endl;
        }
        return 0;
    }

    // bに1が一個もない場合はダメ
    if( b.find("1") == -1 ){
        cout << "NO" << endl;
        return 0;
    }

    cout << "YES" << endl;
}