問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!
データ通信をおこなう際にデータの誤りを検出する方法の一つにパリティチェックがあります。
パリティチェックではデータのブロックごとにパリティビットと呼ばれるビットを 1 つ用意します。
そして、その値をブロックの各ビットとパリティビットの値の和の偶奇が全てのブロックについて同じになるように設定します。
ブロックの各ビットとパリティビットの値の和が偶数になるように設定するパリティビットを偶数パリティ、奇数になるように設定するものを奇数パリティといいます。
パリティチェックにはいくつか種類がありますが今回は垂直水平パリティを扱います。
送信データは w ビットのデータのブロックが h 個であるとします。それぞれのデータのブロックごとに計算する垂直パリティと h 個のデータのブロックにまたがって同じ位置にあるビットから計算する水平パリティを設定します。
垂直水平パリティでは、パリティが正しいかを判定することで 1 ビットの誤りの位置を特定することができます。
垂直パリティが誤っているデータのブロックと水平パリティが誤っているデータのブロックの位置により誤っているビットがどこか特定することが出来ます。
送信途中に 1 ビットの誤りが生じてしまった後の 送信データと、垂直パリティ(h ビット)と水平パリティ(w ビット)が与えられます。
1 ビットの誤りを検出して、送信前の誤りが生じる前の送信データを復元してください。
なお、この問題ではパリティビットの付け方として偶数パリティを採用するものとします。
例として、入力例 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
data_1_1 data_1_2 ... data_1_w
...
data_h_1 data_h_2 ... data_h_w
vertical_parity_1 vertical_parity_2 ... vertical_parity_h
horizontal_parity_1 horizontal_parity_2 ... horizontal_parity_w
data_1_1 data_1_2 ... data_1_w
...
data_h_1 data_h_2 ... data_h_w
すべてのテストケースにおいて、以下の条件をみたします。
・1 ≦ h ≦ 30
・1 ≦ w ≦ 30
・data_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