题目:[SDOI2010] 外星千足虫 - 洛谷
思路:
高斯异或线性方程组,但是n最多到2e3,所以用bitset优化一下(类似与二维数组,但取值只能是0或1,对时间的优化主要在两行数异或,从o(n)变为0(1))。
代码:
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
std::bitset<1010> a[2010];
int n,m,x,maxx=0;
char c,s[1100];
int guss(){
int c=1,r=1;
for(c=1;c<=n;c++){
int t=r;
for(int i=r+1;i<=m;i++) if(a[i][c]>a[t][c]) t=i;
if(!a[t][c]) return 0;
maxx=max(maxx,t);
swap(a[t],a[r]);
for(int i=r+1;i<=m;i++)
if(a[i][c])
a[i]^=a[r];
r++;
}
for(int i=n-1;i>=1;i--)
for(int j=i+1;j<=n;j++)
if(a[i][j]==1) a[i][n+1]=a[i][n+1]^a[j][n+1];
return 1;
}
int main()
{ scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%s%d",s+1,&x);
for(int j=1;j<=n;j++)
if(s[j]=='1') a[i][j]=1;
a[i][n+1]=x;
}
int t=guss();
if(t==0) printf("Cannot Determine\n");
else{
cout<<maxx<<endl;
for(int i=1;i<=n;i++)
if(a[i][n+1]==1) printf("?y7M#\n");
else printf("Earth\n");
}
return 0;
}