問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!
データ通信をおこなう際にデータの誤りを検出する方法の一つにパリティチェックがあります。
パリティチェックではデータのブロックごとにパリティビットと呼ばれるビットを 1 つ用意します。
そして、その値をブロックの各ビットとパリティビットの値の和の偶奇が全てのブロックについて同じになるように設定します。
ブロックの各ビットとパリティビットの値の和が偶数になるように設定するパリティビットを偶数パリティ、奇数になるように設定するものを奇数パリティといいます。
パリティチェックにはいくつか種類がありますが今回は垂直水平パリティを扱います。
送信したいデータを二次元配列の形式に並べたものの行(垂直パリティ)と列(水平パリティ)についてパリティビットを設定します。
垂直水平パリティでは、各列と各行についてパリティが正しいかを判定することで 1 ビットの誤りの位置を特定することができます。
垂直パリティが誤っている行と水平パリティが誤っている列の交差する位置のビットが誤っているビットとなります。
送信途中に 1 ビットの誤りが生じてしまった後の h×w ビットのビット列の値と、送信元データを行ごとに見たときのパリティビットである垂直パリティ(h ビット)と列ごとに見たときのパリティビットである水平パリティ(w ビット)が与えられます。
1 ビットの誤りを検出して、送信前の誤りが生じる前の h×w ビットのビット列を復元してください。
なお、この問題ではパリティビットの付け方として偶数パリティを採用するものとします。
例として、入力例 1 の入力を考えてみましょう。
入力例 1 に対する正しい出力である
1 0 1
0 1 0
1 0 1
1 0 1
0 0 0
1 0 1
1 0 1
0 1 0
1 0 1
h w
b_1_1 b_1_2 ... b_1_w
...
b_h_1 b_h_2 ... b_h_w
vertical_parity_1 vertical_parity_2 ... vertical_parity_h
horizontal_parity_1 horizontal_parity_2 ... horizontal_parity_w
b_1_1 b_1_2 ... b_1_w
...
b_h_1 b_h_2 ... b_h_w
すべてのテストケースにおいて、以下の条件をみたします。
・1 ≦ h ≦ 30
・1 ≦ w ≦ 30
・b_i_j は 0 または 1 (1 ≦ i ≦ h, 1 ≦ j ≦ w)
・vertical_parity_i は 0 または 1 (1 ≦ i ≦ h)
・horizontal_parity_i は 0 または 1 (1 ≦ i ≦ w)
3 3
1 0 1
0 1 0
1 0 1
0 0 0
0 0 0
1 0 1
0 0 0
1 0 1
2 5
1 1 1 0 0
1 0 1 0 1
1 0
1 1 0 0 1
1 1 1 0 0
0 0 1 0 1
1 3
1 1 1
0
1 0 1
1 0 1
6 10
0 0 0 0 0 1 0 0 0 1
1 1 0 0 0 1 0 0 0 1
1 1 1 0 1 0 0 1 0 1
1 1 1 1 0 0 0 1 1 0
1 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0
0 1 0 1 1 0 1 1 1 0
0 0 0 0 0 1 0 0 0 1
1 1 0 0 0 1 0 0 0 1
1 1 1 0 1 0 0 1 0 1
1 1 1 1 0 0 0 1 1 0
1 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0 0 1