Pn(n1, n2, … nm) = n!/n1*n2*…*nm
Если m=3, b=’xyz’, kp=[2, 3, 2], ( в массиве kp записано сколько раз повторятся i-той букве как написано в примере) то перестановки с повторениями будут такими:
01122233 => xxyyyzz
01122323 => xxyyzyz
01122332 => xxyyzzy
01123223 => xxyzyyz
01123232 => xxyzyzy
…
03322211 => zzyyyxx
Словесный алгоритм тот же, что и в обычных перестановках.
var b:string; p,kp:array [0..255] of integer; n,i,j,d,k,l,s:longint;
begin
readln(B)/>;
n:=length(B)/>;
for i:=1 to n do read(kp[i]);
p[0]:=0;
for i:=1 to n do
for j:=1 to kp[i] do
begin
l:=l+1;
p[l]:=i;
end;
n:=l;
while p[0]=0 do
Begin
for i:=1 to n do write(b[p[i]]);
writeln;
s:=s+1;
j:=n;
while p[j-1]>=p[j] do j:=j-1;
k:=n;
while p[j-1]>=p[k] do k:=k-1;
d:=p[k];
p[k]:=p[j-1];
p[j-1]:=d;
for i:=j to (n+j-1)div 2 do
begin
d:=p[i];
p[i]:=p[n-i+j];
p[n-i+j]:=d;
end;
end;
writeln(s);
end.