洛咕 P2447 [SDOI2010]外星千足虫

一开始以为是异或高斯消元,实际上是简单线性基。

直接往线性基里插入,直到线性基满了就解出来了。

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define il inline
#define vd void
typedef 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;
}
posted @ 2018-10-19 13:08  菜狗xzz  阅读(135)  评论(0编辑  收藏  举报