关灯2
2024年12月24日小于 1 分钟
#include <bits/stdc++.h>
using namespace std;
int n, k;
string ss[1005];
map<string, int> m;
int main()
{
cin >> n >> k;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
{
char c;
cin >> c;
ss[j] += c;
}
for (int i = 1; i <= n; i++)
m[ss[i]]++;
int ans = 0;
for (auto now : m)
{
// 钦定 now 需要全 1
string s = now.first;
int num = now.second;
int nowAns = 0; // 能搞定几个
int nowCnt = k; // 还要动几次
for (char c : s)
if (c == '0')
nowCnt--;
if (nowCnt < 0)
continue;
nowAns += num;
// 生成互补串并检查互补串数量
for (int i = 0; i < s.length(); i++)
s[i] = 1 - (s[i] - '0') + '0';
num = m[s]; // 互补串数量
nowAns += min(nowCnt, num);
nowCnt -= min(nowCnt, num);
// 消耗剩余次数
if (nowAns == n)
nowAns -= nowCnt % 2;
ans = max(ans, nowAns);
}
cout << ans << "\n";
return 0;
}