【Luogu】P2447外星千足虫(高斯消元)

  题目链接

  高斯消元解%2意义下的方程,Bitset优化一下。

  在消的过程中就能顺便把有解的第一问求出来,记录一下访问过的最大行。

  

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
#include<cstdlib>
#include<bitset>
#define maxn 1020
#define maxm 2020
using namespace std;
inline long long read(){
    long long num=0,f=1;
    char ch=getchar();
    while(!isdigit(ch)){
        if(ch=='-')    f=-1;
        ch=getchar();
    }
    while(isdigit(ch)){
        num=num*10+ch-'0';
        ch=getchar();
    }
    return num*f;
}

bitset<maxn>s[maxm];

char c[maxn];

int main(){
    int n=read(),m=read();
    for(int i=1;i<=m;++i){
        scanf("%s",c+1);
        for(int j=1;j<=n;++j)    s[i][j]=c[j]-'0';
        s[i][n+1]=read();
    }
    int cnt=0;bool flag=0;
    for(int i=1;i<=n;++i){
        int now=0;
        for(int j=i;j<=m;++j)
            if(s[j][i]){
                now=j;
                break;
            }
        if(now==0){
            flag=1;
            break;
        }
        if(cnt<now)    cnt=now;
        if(now^i)    swap(s[now],s[i]);
        for(int j=1;j<=m;++j){
            if(j==i)    continue;
            if(s[j][i])    s[j]^=s[i];
        }
    }
    if(flag){
        printf("Cannot Determine");
        return 0;
    }
    printf("%d\n",cnt);
    for(int i=1;i<=n;++i){
        if(s[i][n+1])    printf("?y7M#\n");
        else            printf("Earth\n");
    }
    return 0;
}

 

posted @ 2018-03-31 06:35  Konoset  阅读(159)  评论(0编辑  收藏  举报