ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

HJ136 翻之

2026/8/6 6:45:11 拓冰建站 浏览量
HJ136 翻之

知识点哈希

校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。

描述

对于给定的 nn 行 mm 列的矩阵,每一个元素要么是 ‘0’‘0’,要么是 ‘1’‘1’。
每一轮,你可以进行一次以下操作:
∙ ∙选择一行的元素,将其全部反置,即 ‘0’‘0’ 变为 ‘1’‘1’,‘1’‘1’ 变为 ‘0’‘0’。
请你帮助小歪判断,若能进行任意多轮操作(也可以不进行操作),至多能使得多少列的元素均为 ‘1’‘1’。你只需要输出这个最大值。

输入描述:

第一行输入两个正整数 n,m(1≦n,m≦3×103)n,m(1≦n,m≦3×103) 代表矩阵的行数和列数。
此后 nn 行,每行输入一个长度为 mm 、仅由 ‘0’‘0’ 和 ‘1’‘1’ 构成的字符串,代表矩阵每一行中的元素。

输出描述:

输出一个整数,表示至多能使得多少列的元素均为 ‘1’‘1’。

示例1

输入:

3 4 1111 1111 1111

复制输出:

4

复制说明:

在这个样例中,不需要进行操作,所有列的元素均为 ‘1’‘1’。

示例2

输入:

3 2 01 10 11

复制输出:

1

复制说明:

在这个样例中,我们可以选择对第一行进行操作,使得第一行变为 "10""10",此时,第一列的元素均为 ‘1’‘1’。
// 遍历每一列,每一列的字符组成一个字符串,相同的字符串可以在变换的情况下是的全为 1 // 不同的字符串不可能通过变换使得全为 1 ( 能发现这一点就好了 ) #include<bits/stdc++.h> using namespace std; const int N=3e3+6; unordered_map<string,int> unmp; int n,m; string str[N]; int main(){ cin>>n>>m; for(int i=0;i<n;i++){ cin>>str[i]; } for(int i=0;i<m;i++){ string s=""; for(int j=0;j<n;j++){ s+=str[j][i]; } unmp[s]++; } int ans=0; for(auto &[k,v]:unmp){ ans=max(ans,v); } cout<<ans; return 0; }