#include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define PLL pair<LL, LL> #define PLI pair<LL, int> #define PII pair<int, int> #define SZ(x) ((int)x.size()) #define ull unsigned long long using namespace std; const int N = 2e5 + 7; const int inf = 0x3f3f3f3f; const LL INF = 0x3f3f3f3f3f3f3f3f; const int mod = 1e9 + 7; const double eps = 1e-3; const double PI = acos(-1); int T, m, n, up, dp2[1<<20], dp[1<<20], pre[1<<20]; char s[100]; vector<int> ans; int main() { // freopen("tests.in", "r", stdin); scanf("%d", &T); while(T--) { ans.clear(); scanf("%d%d", &m, &n); up = 1 << m; for(int i = 0; i < up; i++) dp2[i] = 0, dp[i] = inf; for(int i = 0; i < n; i++) { scanf("%s", s); int x = 0; for(int j = 0; j < m; j++) if(s[j] == ‘1‘) x += 1 << j; dp2[x]++; } for(int i = 0; i < m; i++) for(int s = 0; s < up; s++) if(s>>i&1) dp2[s^(1<<i)] += dp2[s]; dp[0] = 0; for(int s = 0; s < up; s++) { for(int i = 0; i < m; i++) { if(s>>i&1) continue; int nexs = s | (1<<i); if(dp[s]+dp2[s] < dp[nexs]) { dp[nexs] = dp[s]+dp2[s]; pre[nexs] = s; } } } int nows = up-1, nexs; while(nows) { nexs = pre[nows]; int xo = nexs ^ nows; for(int i = 0; i < m; i++) { if(1<<i == xo) { ans.push_back(i+1); break; } } nows = nexs; } reverse(ans.begin(), ans.end()); printf("%d\n", dp[up-1]); for(int t : ans) printf("%d ", t); puts(""); } return 0; } /* */
原文地址:https://www.cnblogs.com/CJLHY/p/10200426.html
时间: 2024-11-23 08:16:30