[SDOI2010]外星千足虫
题解:
一道高斯消元的裸题
把问题转化为xor的值
之后用bitset优化高斯消元(一个个xor变成一排一起xor) 这样是n^3/32的
另外每一次找方程时只要在下面找到一个当前系数大于0的方程就说明他是有用的(因为如果和上面是重复的那一定等于0了)
当找不到大于0的说明方程缺失
当出现0000000,1时 说明方程无解(当然此题没有这个情况)
代码:
#include <bits/stdc++.h> using namespace std; #define N 2010 int n,ans,m; bitset<1010> a[N]; char c[N]; void pri() { /* for (int i=0;i<m;i++) { cout<<endl; for (int j=0;j<=n;j++) cout<<a[i][j]; } cout<<endl<<endl<<endl; */ } bool Gauss() { int now; for (int i=0;i<n;i++) { now=-1; for (int j=i;j<m;j++) if (a[j][i]) { now=j; break; } if (now==-1) return(0); ans=max(ans,now); if (now!=i) swap(a[i],a[now]); pri(); for (int j=0;j<m;j++) if (j!=i&&a[j][i]) a[j]^=a[i]; pri(); } return 1; } int main() { cin>>n>>m; int x; for (int i=0;i<m;i++) { cin>>c; for (int j=0;j<n;j++) a[i][j]=c[j]-'0'; cin>>x; a[i][n]=x; } pri(); if (!Gauss()) cout<<"Cannot Determine"; else { cout<<ans+1<<endl; for (int j=0;j<n;j++) if (a[j][n]) cout<<"?y7M#"<<endl; else cout<<"Earth"<<endl; } return 0; }