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; }