#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
int bt[n], zero = 0, one = 0, two = 0, cnt[m];
memset(bt,0,sizeof(bt));
memset(cnt,0,sizeof(cnt));
for(int i=0;i<n;i++)
for(int j=0;j<m;j++) {
int a;
cin >> a;
cnt[j] += a;
bt[i] |= (a << j);
}
for(int i=0;i<n;i++)
bt[i] = ((1<<m)-1) & (~bt[i]);
for(int i=0;i<m;i++)
if(cnt[i] >= (n / 2) + 2)
zero++;
else if(cnt[i] == (n / 2) + 1)
one |= (1 << i);
else if(cnt[i] == (n / 2))
two |= (1 << i);
vector<vector<int>> dp(m+1,vector<int>(1<<m,-1e6));
for(int i=0;i<n;i++)
dp[m][bt[i]] = 0;
auto up = [&dp,m](int i, int j) {
int st = j & ((1 << m) - (1 << (m - i))), qry = j & ((1 << (m - i)) - 1);
int qpt = qry & ~(1 << (m - i - 1));
dp[i][j] = max(dp[i+1][st|qpt],dp[i+1][st|1<<(m-i-1)|qpt]+!!(qry&(1<<(m-i-1))));
};
for(int i=m;i--;)
for(int j=0;j<(1<<m);j++)
up(i, j);
int btcnt[1<<m];
memset(btcnt,0,sizeof(btcnt));
for(int i=0;i<n;i++)
btcnt[bt[i]]++;
for(int i=0;i<n;i++) {
int qmask = (one&~bt[i])|(two&bt[i]);
if(btcnt[bt[i]] >= 2)
cout << zero + __builtin_popcount(one & bt[i]) + dp[0][qmask] << "\n";
else {
dp[m][bt[i]] = -1e6;
for(int j=m;j--;)
up(j,(bt[i]&((1<<m)-(1<<(m-j))))|(qmask&((1<<(m-j))-1)));
cout << zero + __builtin_popcount(one & bt[i]) + dp[0][qmask] << "\n";
dp[m][bt[i]] = 0;
for(int j=m;j--;)
up(j,(bt[i]&((1<<m)-(1<<(m-j))))|(qmask&((1<<(m-j))-1)));
}
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |