<p>You are given an <code>m x n</code> binary matrix <code>matrix</code>.</p>

<p>You can choose any number of columns in the matrix and flip every cell in that column (i.e., Change the value of the cell from <code>0</code> to <code>1</code> or vice versa).</p>

<p>Return <em>the maximum number of rows that have all values equal after some number of flips</em>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> matrix = [[0,1],[1,1]]
<strong>Output:</strong> 1
<strong>Explanation:</strong> After flipping no values, 1 row has all values equal.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> matrix = [[0,1],[1,0]]
<strong>Output:</strong> 2
<strong>Explanation:</strong> After flipping values in the first column, both rows have equal values.
</pre>

<p><strong class="example">Example 3:</strong></p>

<pre>
<strong>Input:</strong> matrix = [[0,0,0],[0,0,1],[1,1,0]]
<strong>Output:</strong> 2
<strong>Explanation:</strong> After flipping values in the first two columns, the last two rows have equal values.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>m == matrix.length</code></li>
	<li><code>n == matrix[i].length</code></li>
	<li><code>1 &lt;= m, n &lt;= 300</code></li>
	<li><code>matrix[i][j]</code> is either&nbsp;<code>0</code> or <code>1</code>.</li>
</ul>

class Solution {
public:
/*                   *******************Approach*******************
 * Logic is to find the repeating row pattern, and return the number of row pattern which occours most.
 *
 * Example 3: From problem: [0,0,0] pattern is "TTT", [0,0,1] pattern is "TTF", [1,1,0] pattern is "TTF"
 * as you can see "TTF" pattern occours 2 times and its hight one so return 2.
 *
 * NOTE: For every row 1st element is T and then of other elements are same as 1st one then mark them T else F
*/
    int maxEqualRowsAfterFlips(vector<vector<int>>& matrix) {
        unordered_map<string, int> m;
        int numberOfCol = matrix[0].size();
        int maxRows = 0;

        for (auto row : matrix) {
            string st = "";
            for (int col = 0; col < numberOfCol; col++) {
                if (row[col] == row[0]) st = st + 'T';
                else st = st + 'F';
            }
            m[st]++;
        }

        for (auto it = m.begin(); it != m.end(); it++) {
            maxRows = max(maxRows, it->second);
        }
        return maxRows;
    }
};
405400