[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;
}
原文地址:https://www.cnblogs.com/yinwuxiao/p/8711357.html