contact.pas

来自「Magio牛的usaco源代码」· PAS 代码 · 共 88 行

PAS
88
字号
{
ID:maigoak1
PROG:contact
}

program contact;
const
  maxab=12;
  maxn=50;
var
  fin,fout:text;
  freq:array[2..8191]of longint;
  rank:array[1..maxn]of longint;
  a,b,n,bottom,top,ranks,i,j,k,count:integer;
  c:char;
  s:string;
function min(a,b:integer):integer;
  begin
    if a<b then min:=a else min:=b;
  end;
function str2num(s:string):integer;
  var
    i:integer;
  begin
    str2num:=1;
    for i:=1 to length(s) do
      str2num:=str2num*2+ord(s[i])-48;
  end;
function num2str(n:integer):string;
  begin
    num2str:='';
    repeat
      if odd(n) then num2str:='1'+num2str else num2str:='0'+num2str;
      n:=n div 2;
    until n=1;
  end;
begin
  fillchar(freq,sizeof(freq),0);
  assign(fin,'contact.in');
  reset(fin);
  readln(fin,a,b,n);
  repeat
    repeat
      read(fin,c);
    until (c='0') or (c='1') or eof(fin);
    if eof(fin) then break;
    s:=s+c;
    if length(s)>b then s:=copy(s,2,b);
    for i:=a to min(length(s),b) do
      inc(freq[str2num(copy(s,length(s)-i+1,i))]);
  until false;
  close(fin);

  bottom:=power(2,a);
  top:=power(2,b+1)-1;
  fillchar(rank,sizeof(rank),0);
  ranks:=0;
  for i:=bottom to top do
    for j:=1 to n do
      if freq[i]>rank[j] then begin
        if ranks<n then inc(ranks);
        for k:=ranks downto j+1 do
          rank[k]:=rank[k-1];
        rank[j]:=freq[i];
        break;
      end
      else if freq[i]=rank[j] then break;

  assign(fout,'contact.out');
  rewrite(fout);
  for i:=1 to ranks do begin
    writeln(fout,rank[i]);
    count:=0;
    for j:=bottom to top do
      if freq[j]=rank[i] then begin
        if count>0 then write(fout,' ');
        write(fout,num2str(j));
        inc(count);
        if count=6 then begin
          count:=0;
          writeln(fout);
        end;
      end;
    if count>0 then writeln(fout);
  end;
  close(fout);
end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?