解方程的东西 无疑几个算法:变成图进行网络流/模拟高斯消元/并查集(逻辑方程)
这题用的是朴素高斯消元 实际上没有网络上说什么位压缩运算那么复杂 直接把加法改成xor就行了
附代码
//dsy1923 tyvj1737
var matrix:array[0..2005,0..1005]of byte;
x:array[0..1005]of longint;
n,m,max:longint;
procedure exitt;
begin
writeln('Cannot Determine');
halt;
end;
procedure MatrixXor(a,b:longint{save in a});
var i:longint;
begin
for i:=1 to n+1 do
matrix[a,i]:=matrix[a,i]xor matrix[b,i];
end;
function Review(t:longint):longint;
var i:longint;
begin
review:=0;
for i:=t+1 to n do
if matrix[t,i]=1 then
review:=review xor x[i];
review:=review xor matrix[t,n+1];
end;
procedure work;
var i,j,k:longint;
begin
for i:=1 to n do
begin
for j:=i to m do
if matrix[j,i]=1 then
break;
if matrix[j,i]=0 then exitt;
if j>max then max:=j;
matrix[0]:=matrix[j];matrix[j]:=matrix[i];matrix[i]:=matrix[0];
for k:=i+1 to m do
if matrix[k,i]=1 then
MatrixXor(k,i);
end;
x[n]:=matrix[n,n+1];
for i:=n-1 downto 1 do
x[i]:=Review(i);
end;
procedure print;
var i:longint;
begin
writeln(max);
for i:=1 to n do
if x[i]=0 then
writeln('Earth')
else
writeln('?y7M#');
end;
procedure init;
var i,j:longint;
c:char;
begin
readln(n,m);
for i:=1 to m do
begin
for j:=1 to n do
begin
read(c);
if c='1' then matrix[i,j]:=1 else matrix[i,j]:=0;
end;
read(c);read(c);
if c='1' then matrix[i,n+1]:=1 else matrix[i,n+1]:=0;
readln;
end;
end;
begin
//assign(input,'in.txt');reset(input);
init;
work;
print;
end.