题解 CF554B Ohana Cleans Up & AcWing.3814 矩阵变换
这个题的意思是:给定一个 \(n \times n\) 的 \(01\) 矩阵,可以修改若干列,求修改后最多有多少行的元素都为 \(1\),并输出这个数。
很明显这又是一道思维题,我们可以从中发现一些性质:设这个矩阵有 \(2\) 行:
- 当这 \(2\) 行完全相同时,则改变一列后,这一列的两个数仍相同。
- 当这 \(2\) 行不相同时,则改变一列后,这一列的两个数不同。
然后我们就可以发现:
- 行与行之间的相等不变。
- 任意行均可变成全 \(1\)。
于是我们可以将问题转化成:统计每一行的次数,求出次数最大值就可以了。这样统计的话我们把每一行看作一个字符串,用一个哈希表就行了。
#include <iostream>
#include <unordered_map>
using namespace std;
int main()
{
int n;
cin >> n;
unordered_map<string, int> cnt;
while (n--)
{
string s;
cin >> s;
cnt[s]++;
}
int ans = 0;
for (auto [k, v] : cnt) ans = max(ans, v);
cout << ans << endl;
return 0;
}

浙公网安备 33010602011771号