https://codeforces.com/gym/105909
M题:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e2+7;
int n,m,a[N],b[N],pos[N];
int s[N];
bool flag;
int count(int x){
int res=0;
while(x){
x-=x&-x;
res++;
}
return res;
}
bool check(int sta){
memset(pos,0,sizeof pos);
for(int i=1;i<=m;i++){
pos[i]=count(s[i]&sta);
}
sort(pos+1,pos+1+m,greater<int>());
return pos[a[1]]==b[1]&&pos[a[2]]==b[2]&&pos[a[3]]==b[3];
}
void dfs(int dep,int cnt,int sta){
if(flag)return;
if(dep>=n+1){
if(cnt<10)return;
if(cnt>13)return;
if(!check(sta))return;
else{
cout<<cnt<<endl;
for(int i=0;i<=n-1;i++){
if((sta>>i)&1)cout<<i+1<<" ";
}
cout<<endl;
flag=1;
return;
}
}
dfs(dep+1,cnt+1,sta|(1<<(dep-1)));
if(flag)return;
dfs(dep+1,cnt,sta);
if(flag)return;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
string str;cin>>str;
int mask=0;
for(int j=0;j<n;j++){
if(str[j]=='1')mask|=(1<<j);
}
s[i]=mask;
}
for(int i=1;i<=3;i++)cin>>a[i];
for(int i=1;i<=3;i++)cin>>b[i];
dfs(1,0,0);
if(!flag)cout<<-1<<endl;
}
 Collegiate Programming Contest 部分补题&spm=1001.2101.3001.5002&articleId=155039181&d=1&t=3&u=e8ad8f088b6946f7af0a54e38895b65f)
2850

被折叠的 条评论
为什么被折叠?



