类似于DP一样做,但这题有个大坑,自己看DIS吧。。。。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <climits> #include <string.h> #define LL __int64 using namespace std; const int N=1<<16; const int inf=1<<30; int dp[N]; char str[25]; int ans[25]; int num[125],b,n,goal; int judge(int f,int s){ int tmp;int c=0; for(int k=0;k<b;k++){ tmp=1<<k; if((f&tmp)==(s&tmp)) c++; } return c; } int main(){ while(scanf("%d%d",&b,&n)!=EOF){ scanf("%s",str+1); goal=0; int len=strlen(str+1); for(int i=len;i>=1;i--){ int t=str[i]-'0'; goal+=t*(1<<(b-i)); } int tmp=(1<<b)-1;; for(int k=1;k<=n;k++){ scanf("%s",str+1); len=strlen(str+1); num[k]=0; for(int i=len;i>=1;i--){ int t=str[i]-'0'; num[k]+=t*(1<<(b-i)); } } bool flag=false; for(int k=1;k<=n;k++){ if(num[k]==goal){ len=0; if(goal==0){ printf("1 "); int pos=goal; while(b--){ ans[++len]=pos%2; pos>>=1; } for(int i=len;i>0;i--) printf("%d",ans[i]); printf(" "); flag=true; break; } else if(goal!=0){ printf("2 "); int pos=goal; while(b--){ ans[++len]=pos%2; pos>>=1; } for(int i=len;i>0;i--) printf("%d",ans[i]); printf(" "); flag=true; break; } } } if(flag) continue; for(int k=0;k<=tmp;k++){ dp[k]=inf; } for(int i=1;i<=n;i++) dp[num[i]]=0; for(int i=1;i<=n;i++){ for(int k=0;k<=tmp;k++){ dp[k]=min(dp[k],dp[k^num[i]]+1); } } int pos=-1,c=-1,t; for(int k=0;k<=tmp;k++){ if(dp[k]!=inf){ t=judge(k,goal); if(t>c){ pos=k; c=t; } else if(t==c){ if(dp[pos]>dp[k]) pos=k; } } } printf("%d ",dp[pos]); len=0; while(b--){ ans[++len]=pos%2; pos>>=1; } for(int i=len;i>0;i--) printf("%d",ans[i]); printf(" "); } return 0; }