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 + -
显示快捷键?