牛客周赛 Round 69 - D bitset做法
小心火烛的歪
https://ac.nowcoder.com/acm/contest/96115/D
D题
bitset做法 直接枚举所有2^q种情况
因为数据范围很小 所以O(2^q*q*n*m)即可通过该题
#include <iostream>
#include <bitset>
using namespace std;
int main() {
int n,m,q;
cin>>n>>m>>q;
bitset<49> a, b[7];
string s, t;
for (int i=1; i<=n; i++)
cin>>t, s += t;
a = bitset<49>(s);
for (int k=0; k<q; k++) {
s = "";
for (int i=1; i<=n; i++)
cin>>t, s += t;
b[k] = bitset<49>(s);
}
int mn = q+1, res;
for (int i=0; i<1<<q; i++) {
if (__builtin_popcount(i) >= mn)
continue;
bitset<49> ans;
for (int j=0; j<q; j++)
if (i>>j&1)
ans |= b[j];
if ((ans|a) == (1ll<<m*n)-1 && (ans&a) == 0)
mn = __builtin_popcount(i), res = i;
}
if (mn == q+1)
mn = -1;
cout<<mn<<'\n';
if (mn != -1) {
for (int j=0; j<q; j++)
if (res>>j&1)
cout<<j+1<<' ';
cout<<'\n';
}
return 0;
}