[Sdoi2010]外星千足虫

解方程的东西 无疑几个算法:变成图进行网络流/模拟高斯消元/并查集(逻辑方程)

这题用的是朴素高斯消元 实际上没有网络上说什么位压缩运算那么复杂 直接把加法改成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.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值