BZOJ 1923: [Sdoi2010]外星千足虫 高斯消元+bitset

高斯消元求解异或方程组,可以多学一下 $bitset$ 在位运算中的各种神奇操作.  

#include <cstdio> 
#include <bitset>   
#define N 2004  
#define setIO(s) freopen(s".in","r",stdin) , freopen(s".out","w",stdout) 
using namespace std; 
int n,m,ans;   
char str[N]; 
bitset<N>v[N];  
int main() 
{ 
    int i,j,k; 
    // setIO("input"); 
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;++i) 
    { 
        int tmp; 
        scanf("%s%d",str+1,&tmp); 
        for(j=1;j<=n;++j) v[i][j]=(str[j]=='0'?0:1);    
        v[i][n+1]=tmp;  
    }    
    for(i=1;i<=n;++i) 
    {
        for(j=i;j<=m;++j) 
        {
            if(v[j][i]) 
            {
                ans=max(ans,j),swap(v[j],v[i]); 
                break; 
            }
        }
        if(!v[i][i]) 
        {     
            printf("Cannot Determine\n"); 
            return 0;   
        }
        for(j=i+1;j<=m;++j) if(v[j][i]) v[j]^=v[i];    
    }
    printf("%d\n",ans);   
    for(i=1;i<=n;++i) 
    {
        for(j=i+1;j<=n;++j) if(v[i][j]) v[i]^=v[j];
        if(v[i][n+1]) printf("?y7M#\n"); 
        else printf("Earth\n");             
    }
    return 0; 
}

  

posted @ 2019-09-16 08:56  EM-LGH  阅读(119)  评论(0编辑  收藏  举报