浅谈竞赛中哈希表的应用(七)

                哈尔滨市第三中学 刘翀



          5. 《方程的解》的程序 

  program equation;
   const maxm=150;
      max=4000037;
   var k,p:array[1..6]of longint;
      fin,fout:text;
      n,m:integer;
      ans:longint;
      mi:array[1..maxm,1..30]of longint;
      e:array[0..max-1,1..2]of longint;
   procedure init;
    var i:integer;
    begin
     assign(fin,'equation.in');
     assign(fout,'equation.out');
     reset(fin);
     rewrite(fout);
     read(fin,n);
     read(fin,m);
     for i:=1 to n do
      read(fin,k[i],p[i]);
     close(fin);
     fillchar(e,sizeof(e),0);
     ans:=0;
    end;
  procedure precompute;
   var i,j:integer;
     tmp:longint;
   begin
    for j:=1 to 30 do
     mi[1,j]:=1;
    for i:=2 to m do
     begin
      tmp:=1;
      for j:=1 to trunc(ln(maxlongint)/ln(i)) do
       begin
        tmp:=tmp*i;
        mi[i,j]:=tmp;
       end;
     end;
    end;
  function locate(x:longint):longint;
   var i,t:longint;
   begin
    t:=abs(x) mod max;
    i:=0;
    while (e[(t+i)mod max,1]<>0)and(e[(t+i)mod max,1]<>x) do
     inc(i);
    locate:=(t+i) mod max;
   end;
  procedure ins(x:longint);
   var posi:longint;
   begin
    posi:=locate(x);
    e[posi,1]:=x;
    inc(e[posi,2]);
   end;
  procedure solve(a:integer;s:longint);
   var i:integer;
   begin
    if a=n div 2 then begin
                for i:=1 to m do
                  ins(s+k[a]*mi[i,p[a]]);
                exit;
               end;
    for i:=1 to m do
     solve(a+1,s+k[a]*mi[i,p[a]]);
   end;
  procedure find(a:integer;s:longint);
   var i:integer;
      tmp,posi:longint;
   begin
    if a=n then begin
            for i:=1 to m do
             begin
               tmp:=-1*(s+k[a]*mi[i,p[a]]);
               posi:=locate(tmp);
               if e[posi,1]=tmp then inc(ans,e[posi,2]);
             end;
           exit;
         end;
    for i:=1 to m do
     find(a+1,s+k[a]*mi[i,p[a]]);
   end;
  procedure out;
   begin
    writeln(fout,ans);
    close(fout);
   end;
  procedure special;
   var i:integer;
   begin
    if n=1 then begin
            if p[1]=0 then writeln(fout,m)
                  else writeln(fout,0);
            close(fout);
            halt;
           end;
   end;
  begin
   init;
   precompute;
   special;
   solve(1,0);
   find(n div 2+1,0);
   out;
  end.


          6. 《迷宫的墙》的程序

  program the_100_tough_problems_0020_walls_in_the_maze;
   const maxn=6001;
       p=7499;
   var fin,fout:text;
     n,ans:integer;
     data:array[1..maxn,1..4]of longint;
     e:array[0..2,0..p-1,1..4]of longint;
     r:array[1..maxn]of longint;
  procedure init;
   var i,j:integer;
      ch:char;
   begin
    assign(fin,'d:\test\lab14.in');
    assign(fout,'d:\test\lab.txt');
    reset(fin);
    rewrite(fout);
    readln(fin,n);
    for i:=1 to n-1 do
     begin
      read(fin,ch);
      case ch of
       'N':data[i,1]:=0;
       'Z':data[i,1]:=1;
       'C':data[i,1]:=2;
      end;
      for j:=2 to 4 do
       read(fin,data[i,j]);
      readln(fin);
     end;
    close(fin);
    ans:=n;
    fillchar(e,sizeof(e),0);
    for i:=1 to n do
     r[i]:=i;
   end;
  function locate(var a,b,c,d:longint):longint;
   var t:longint;
      i:integer;
   begin
    t:=r[b]*sqr(n)+r[c]*n+r[d];
    t:=t mod p;
    i:=0;
    while (e[a,(t+i)mod p,1]<>0)and(e[a,(t+i)mod p,1]<>r[b]) do
     if (e[a,(t+i)mod p,2]<>r[c])or(e[a,(t+i)mod p,3]<>r[d]) then inc(i);
    locate:=(t+i)mod p;
   end;
  procedure main;
   var i,j,t,k:integer;
   begin
    for i:=n-1 downto 1 do
     begin
      t:=locate(data[i,1],data[i,2],data[i,3],data[i,4]);
      if e[data[i,1],t,1]<>r[data[i,2]] then begin
                   for j:=2 to 4 do
                    e[data[i,1],t,j-1]:=r[data[i,j]];
                   e[data[i,1],t,4]:=i;
                  end
               else begin
                    dec(ans);
                    r[i]:=e[data[i,1],t,4];
                    {for j:=1 to i-1 do
                     for k:=2 to 4 do
                      if data[j,k]=i then
                       data[j,k]:=e[data[i,1],t,4];}
                    end;
     end;
   end;
  procedure out;
   begin
    writeln({fout,}ans);
    close(fout);
   end;
  begin
   init;
   main;
   out;
  end.


                      相关链接:浅谈竞赛中哈希表的应用(一)
                           浅谈竞赛中哈希表的应用(二)
                           浅谈竞赛中哈希表的应用(三)
                           浅谈竞赛中哈希表的应用(四)
                           浅谈竞赛中哈希表的应用(五)
                           浅谈竞赛中哈希表的应用(六)
                           浅谈竞赛中哈希表的应用(七)
  

 

 
 
网站导航 | 关于曙光 | 联系我们 | 请提意见
Copyright © FuJian Sunshine Educational Info. Co.,Ltd.
福建曙光教育资讯有限公司 版权所有