一开始以为是异或高斯消元,实际上是简单线性基。
直接往线性基里插入,直到线性基满了就解出来了。
// luogu-judger-enable-o2#include#define il inline#define vd voidtypedef long long ll;il int gi(){ int x=0,f=1; char ch=getchar(); while(!isdigit(ch)){ if(ch=='-')f=-1; ch=getchar(); } while(isdigit(ch))x=x*10+ch-'0',ch=getchar(); return x*f;}std::bitset<1001>f[1001],s;char S[1010],y[1010];bool ans[1010];int main(){#ifndef ONLINE_JUDGE freopen("2309.in","r",stdin); freopen("2309.out","w",stdout);#endif int n=gi(),m=gi(),tot=0; for(int yyb=1;yyb<=m;++yyb){ scanf("%s",S+1); for(int i=1;i<=n;++i)s[i]=S[i]=='1'; s[0]=gi(); for(int i=s._Find_next(0);i<=n;i=s._Find_next(i)){ if(!y[i]){ y[i]=1,f[i]=s;++tot; if(tot==n){ for(int i=n;i;--i){ ans[i]=f[i][0]; for(int j=f[i]._Find_next(i);j<=n;j=f[i]._Find_next(j)) ans[i]^=ans[j]; } printf("%d\n",yyb); for(int i=1;i<=n;++i)puts(ans[i]?"?y7M#":"Earth"); return 0; } break; }else s^=f[i]; } } puts("Cannot Determine"); return 0;}