1. paizaラーニングトップ
  2. レベルアップ問題集
  3. 第2回P共通テスト過去問題セット(言語選択)
  4. 問題一覧 C編
  5. パリティチェック C編

第2回P共通テスト過去問題セットのサムネイル
パリティチェック C編(paizaランク B 相当)

問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!

問題

下記の問題をプログラミングしてみよう!

データ通信をおこなう際にデータの誤りを検出する方法の一つにパリティチェックがあります。
パリティチェックではデータのブロックごとにパリティビットと呼ばれるビットを 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


を上の水平垂直パリティと合わせてみてみると、2 行目と 2 列目についてビットの和が偶数になっていないのでこの行と列の交差するビットに誤りが生じているとわかります。よって、誤りを修正した後のビット列は

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


・1 行目では垂直水平パリティを付与する際の列のビット数 h と行のビット数 w が半角スペース区切りで与えられます。
・2 行目から h+1 行目では 1 ビットの誤りが生じてしまった後の h*w ビットの値が与えられます。各ビットの間は半角スペースで区切られており、各行の間は改行で区切られています。
・3 行目では送信元データを行ごとに分けた時の h ビットの垂直パリティが半角スペース区切りで与えられます。
・4 行目では送信元データを列ごとに分けた時の w ビットの水平パリティが半角スペース区切りで与えられます。


入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。 標準入力からの値取得方法はこちらをご確認ください
期待する出力

b_1_1 b_1_2 ... b_1_w
...
b_h_1 b_h_2 ... b_h_w


・入力として与えられたビットの 1 ビットの誤りを訂正して得られる、誤りが生じる前の 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)

入力例1

3 3
1 0 1
0 1 0
1 0 1
0 0 0
0 0 0

出力例1

1 0 1
0 0 0
1 0 1

入力例2

2 5
1 1 1 0 0
1 0 1 0 1
1 0
1 1 0 0 1

出力例2

1 1 1 0 0
0 0 1 0 1

入力例3

1 3
1 1 1
0
1 0 1

出力例3

1 0 1

入力例4

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

出力例4

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

問題一覧へ戻る

ページの先頭へ戻る