You will be given a two-dimensional array with row consisting values 0 or 1.  
A move consists of choosing any column or row, and toggling all the 0’s as 1’s and 1’s as 0’s.  
After making the required moves, every row represents a binary number and the score of the matrix will be sum of all the numbers represented as binary numbers in each row.  
Find the highest possible score.  
$Example:$ 
Input:

0 0 1 1

1 0 1 0

1 1 0 0  
Output:

39
Explanation:

Toggled to

1 1 1 1

1 0 0 1

1 1 1 1  
0b1111 + 0b1001 + 0b1111 = 15 + 9 + 15 = 39

-----Input:-----
- First line will contains $m$, $n$ for the size of the 2-D array. 
- Contains $m$ lines of $n$ space-separated values each. 

-----Output:-----
Single integer which is the maximum score obtained by the sum of binary numbers.

-----Constraints-----
- $1 \leq m, n \leq 20$
- $A[i][j] = 1$ or $0$ 

-----Sample Input:-----
3 4  
0 0 1 1  
1 0 1 0  
1 1 0 0  

-----Sample Output:-----
39

Source: codechef | Difficulty: UNKNOWN_DIFFICULTY


Solutions:
def matrixScore(A):
	(m, n) = (len(A), len(A[0]))
	for i in range(m):
		if A[i][0] == 1:
			continue
		for j in range(n):
			A[i][j] = 1 - A[i][j]
	res = 0
	for rows in zip(*A):
		cnt1 = max(rows.count(1), rows.count(0))
		res += cnt1 * 2 ** (n - 1)
		n -= 1
	return res
(m, n) = [int(s) for s in input().split(' ')]
arr = [[int(s) for s in input().split(' ')] for i in range(m)]
ans = matrixScore(arr)
print(ans)


(m, n) = map(int, input().split())
A = [list(map(int, input().split())) for _ in range(m)]
(m, n) = (len(A), len(A[0]))
for i in range(m):
	if A[i][0] == 0:
		for j in range(n):
			A[i][j] ^= 1
for j in range(n):
	cnt = sum((A[i][j] for i in range(m)))
	if cnt < m - cnt:
		for i in range(m):
			A[i][j] ^= 1
print(sum((int(''.join(map(str, A[i])), 2) for i in range(m))))


(R, C) = map(int, input().split())
A = []
for i in range(R):
	p = list(map(int, input().split()))
	A.append(p)
(m, n) = (len(A), len(A[0]))
for i in range(m):
	if A[i][0] == 0:
		for j in range(n):
			A[i][j] ^= 1
for j in range(n):
	cnt = 0
	for i in range(m):
		if A[i][j] == 1:
			cnt += 1
	if cnt < m - cnt:
		for i in range(m):
			A[i][j] ^= 1
res = 0
for i in range(m):
	ans = ''
	for j in range(n):
		ans += str(A[i][j])
	res += int(ans, 2)
print(res)


def row(array, j):
	for i in range(len(array[0])):
		if array[j][i] == 0:
			array[j][i] = 1
		else:
			array[j][i] = 0

def col(array, j):
	for i in range(len(array)):
		if array[i][j] == 0:
			array[i][j] = 1
		else:
			array[i][j] = 0
(m, n) = list(map(int, input().split(' ')))
lt = []
for i in range(m):
	temp = list(map(int, input().split(' ')))
	lt.append(temp)
for i in range(len(lt)):
	if lt[i][0] == 0:
		row(lt, i)
for i in range(1, len(lt[0])):
	count1 = 0
	count0 = 0
	for j in range(len(lt)):
		if lt[j][i] == 0:
			count0 = count0 + 1
		else:
			count1 = count1 + 1
	if count0 > count1:
		col(lt, i)
st = []
for i in range(len(lt)):
	temp1 = ''
	for j in range(len(lt[i])):
		temp1 = temp1 + str(lt[i][j])
	st.append(temp1)
ans = 0
for i in range(len(st)):
	ans = ans + int(st[i], 2)
print(ans)


class Solution:

	def matrixScore(self, A):
		(m, n) = (len(A), len(A[0]))
		for i in range(m):
			if A[i][0] == 0:
				for j in range(n):
					A[i][j] ^= 1
		for j in range(n):
			cnt = sum((A[i][j] for i in range(m)))
			if cnt < m - cnt:
				for i in range(m):
					A[i][j] ^= 1
		return sum((int(''.join(map(str, A[i])), 2) for i in range(m)))
(n, m) = map(int, input().split())
A = []
for _ in range(n):
	x = list(map(int, input().split()))
	A.append(x)
c = Solution()
print(c.matrixScore(A))