【高斯消元】【异或方程组】【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\n",use); for(int i=1;i<=n;++i) puts(x[i]?"?y7M#":"Earth"); } return 0; }
——The Solution By AutSky_JadeK From UESTC
转载请注明出处:http://www.cnblogs.com/autsky-jadek/