zoukankan      html  css  js  c++  java
  • 【高斯消元】【异或方程组】【bitset】bzoj1923 [Sdoi2010]外星千足虫

    Xor方程组解的个数判定:

    ——莫涛《高斯消元解Xor方程组》

    使用方程个数判定:消去第i个未知数时,都会记录距第i个方程最近的第i位系数不为0の方程是谁,这个的max就是使用方程个数。

    使用bitset加速。

    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<bitset>
    using namespace std;
    #define N 1001
    #define M 2001
    int n,m,use;
    char s[N];
    bool A[M][N+1],x[N],b[M];
    bitset<N+1>B[M];
    bool guass_jordan()
    {
    	for(int i=1;i<=m;++i)
    	  for(int j=1;j<=n;++j)
    	    B[i][j]=A[i][j];
    	for(int i=1;i<=m;++i)
    	  B[i][n+1]=b[i];
    	for(int i=1;i<=n;++i)
    	  {
    	  	int j=i;
    	  	for(;j<=m;++j)
    	  	  if(B[j][i])
    	  	    break;
    	  	if(j==m+1)
    		  return 0;
    	  	use=max(use,j);
    	  	swap(B[i],B[j]);
    	  	for(j=1;j<=m;++j)
    	  	  if(i!=j&&B[j][i])
    	  	    B[j]^=B[i];
    	  }
    	for(int i=1;i<=m;++i) x[i]=B[i][n+1];
    	return 1;
    }
    int main()
    {
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=m;++i)
    	  {
    	  	scanf("%s%d",s,&b[i]);
    	  	for(int j=0;j<n;++j)
    	  	  A[i][j+1]=s[j]-'0';
    	  }
    	if(!guass_jordan())
    	  puts("Cannot Determine");
    	else
    	  {
    	  	printf("%d
    ",use);
    	  	for(int i=1;i<=n;++i)
    	  	  puts(x[i]?"?y7M#":"Earth");
    	  }
    	return 0;
    }
  • 相关阅读:
    Linux IPC udp/ip socket 编程
    Linux IPC tcp/ip socket 编程
    Linux IPC BSD socket编程基础
    Linux IPC POSIX 信号量
    Linux IPC POSIX 消息队列
    Linux IPC POSIX 共享内存
    Linux IPC System V 信号量
    Linux IPC System V 消息队列
    Linux IPC System V 共享内存
    ipcs, ipcrm
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/4344510.html
Copyright © 2011-2022 走看看