#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
using namespace std;
int main() {
// 读取矩阵的行数n和列数m
int n, m;
cin >> n >> m;
// 定义n行的字符串向量,存储矩阵数据
vector<string> matrix(n);
for (int i = 0; i < n; ++i) {
cin >> matrix[i]; // 逐行读取矩阵数据
}
// 哈希表:key是翻转模式字符串,value是该模式出现的次数
unordered_map<string, int> pattern_counts;
// 遍历每一列j
for (int j = 0; j < m; ++j) {
string pattern; // 存储当前列的翻转模式
// 遍历当前列的每一行i
for (int i = 0; i < n; ++i) {
// 如果当前元素是'0',则需要翻转该行(记为'1')
if (matrix[i][j] == '0') {
pattern.push_back('1');
}
// 如果当前元素是'1',则不需要翻转该行(记为'0')
else {
pattern.push_back('0');
}
}
// 将该列的翻转模式存入哈希表,并增加计数
pattern_counts[pattern]++;
}
// 遍历哈希表,找出出现次数最多的翻转模式
int max_cols = 0;
for (const auto& pair : pattern_counts) {
if (pair.second > max_cols) {
max_cols = pair.second; // 更新最大列数
}
}
// 输出结果:最多能有多少列全为'1'
cout << max_cols << endl;
return 0;
}