【bzoj1923】外星千足虫

这个gauss消元有点naive啊。

由于只有01,位操作显然是方便的多。

那么用bitset代替之前的增广矩阵就行了。

#include<bits/stdc++.h>
#define N 1005
using namespace std;
int n,m,ans;
char s[N];
bitset<N> a[2*N];
bool gauss(){
    int now=0;
    for(int i=1;i<=n;i++){
        int j=now+1;
        while(!a[j][i]&&j<=m)++j;
        if(j==m+1){ans=-1;return 0;}
        else ans=max(ans,j);
        ++now;swap(a[j],a[now]);
        for(int k=1;k<=m;k++)
        if(k!=now&&a[k][i])a[k]^=a[now];
    }
}
inline int read(){
    int f=1,x=0;char ch;
    do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');
    do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');
    return f*x;
}
int main(){
    n=read();m=read();
    for(int i=1;i<=m;i++){
        scanf("%s",s+1);for(int j=1;j<=n;j++)a[i][j]=s[j]-'0';
        scanf("%s",s+1);a[i][n+1]=s[1]-'0';
    }
    gauss();
    if(ans==-1)puts("Cannot Determine");
    else{
        printf("%d\n",ans);
        for(int i=1;i<=n;i++)if(a[i][n+1])puts("?y7M#");else puts("Earth");
    }
    return 0; 
}

 

posted @ 2017-06-05 17:18  zcysky  阅读(225)  评论(0编辑  收藏  举报