这类问题一般都是按位处理。
从最高位往最低位固定。
判断当前固定的串前面最多能有多少个串(即当后面全是1时),是否满足一半的条件。
遍历即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const double PI= acos(-1.0);
const int M = 1e5+7;
int head[M],cnt;
void init(){cnt=0,memset(head,0,sizeof(head));}
struct EDGE{int to,nxt,w;}ee[M*2];
void add(int x,int y,int w){ee[++cnt].nxt=head[x],ee[cnt].w=w,ee[cnt].to=y,head[x]=cnt;}
char s[110][110];
int vs[M];
ll pw[M];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin>>t;
pw[0]=1;
for(int i=1;i<=60;i++)pw[i]=pw[i-1]*2;
while(t--)
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>(s[i]+1);
ll tp=pw[m]-n;
tp=(tp-1)/2+1;//输出剩余集合字典序多少的 01字符串
v