QBHV - Hoán vị chữ cái

Tác giả: flashmt

Ngôn ngữ: Pascal

var d:array['A'..'Z'] of byte;
    com:array[1..9,0..9] of longint;
    s:string;
    n:byte;
    dem:longint;

procedure init;
var i,j:byte; c:char;
begin
     fillchar(com,sizeof(com),0);
     for i:=1 to n do
     begin
          com[i,0]:=1; com[i,i]:=1;
     end;
     for i:=2 to n do
         for j:=1 to i-1 do
             com[i,j]:=com[i-1,j]+com[i-1,j-1];
     dem:=1;
     i:=n;
     for c:='A' to 'Z' do
         if d[c]>0 then
         begin
              dem:=dem*com[i,d[c]];
              i:=i-d[c];
         end;
end;

procedure rf;
var c:char;
begin
     n:=0;
     fillchar(d,sizeof(d),0);
     while not eof do
     begin
          inc(n);
          read(c);
          inc(d[c]);
     end;
end;

procedure att(i:byte);
var c:char; j:byte;
begin
     for c:='A' to 'Z' do
     begin
          if d[c]>0 then
          begin
               dec(d[c]);
               s:=s+c;
               if i<n then att(i+1)
               else writeln(s);
               inc(d[c]);
               delete(s,i,1);
          end;
     end;
end;

procedure pr;
var i:byte;
begin
     init;
     s:='';
     writeln(dem);
     att(1);
end;

begin
     rf;
     pr;
end.

Download