def solve(): import sys input_data = sys.stdin.read().strip().split() if not input_data: return H = int(input_data[0]) W = int(input_data[1]) matrix = [] idx = 2 for _ in range(H): s = input_data[idx] idx += 1 # 各行は01文字列なので、各文字をintに変換してリストにする row = list(map(int, s)) matrix.append(row) # 操作1・2による「自由削除」を行う関数 def free_deletion(mat): changed = True while changed: changed = False # 操作1: 各行が定数ならその行を削除 new_mat = [] for row in mat: if row and all(x == row[0] for x in row): changed = True continue # この行は削除 new_mat.append(row) mat = new_mat if not mat: # 行がなくなった場合終了 break # 操作2: 各列が定数ならその列を削除 if mat and (len(mat[0]) > 0): ncols = len(mat[0]) cols_to_del = [] for j in range(ncols): col = [row[j] for row in mat] if len(set(col)) == 1: # j列が定数なら cols_to_del.append(j) if cols_to_del: new_mat = [] for row in mat: new_row = [val for j, val in enumerate(row) if j not in cols_to_del] new_mat.append(new_row) mat = new_mat changed = True return mat # 初めに自由削除を実施 matrix = free_deletion(matrix) op3_count = 0 # 操作3(任意削除)の回数 # 行列が空(または列がなくなる)まで処理を続ける while matrix and matrix[0]: num_rows = len(matrix) num_cols = len(matrix[0]) best_row = 0 best_score = -1 # 各行を削除候補として評価 for r in range(num_rows): new_mat = matrix[:r] + matrix[r+1:] score = 0 # new_matが空ならすべて削除につながるとみなす if not new_mat: score = num_cols else: for j in range(num_cols): col = [row[j] for row in new_mat] if len(set(col)) == 1: score += 1 if score > best_score: best_score = score best_row = r # 貪欲に選んだ行を操作3で削除 matrix.pop(best_row) op3_count += 1 # 再度自由削除フェーズを適用 matrix = free_deletion(matrix) sys.stdout.write(str(op3_count) + "\n") if __name__ == '__main__': solve()