let MAX = 256
const ascii_table =
"\0\1\2\3\4\5\6\7\8\9\10\11\12\13\14\15\16\17\0\0\20\21\22\23\24\25\26\27\0\0\30\31\32\33\34\35\36\37\0\0\40\41\42\43\44\45\46\47\0\0\50\51\52\53\54\55\56\57\0\0\60\61\62\63\64\65\66\67\0\0\70\71\72\73\74\75\76\77\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\100\101\102\103\104\105\106\107\0\0\110\111\112\113\114\115\116\117\0\0\120\121\122\123\124\125\126\127\0\0\130\131\132\133\134\135\136\137\0\0\140\141\142\143\144\145\146\147\0\0\150\151\152\153\154\155\156\157\0\0\160\161\162\163\164\165\166\167\0\0\170\171\172\173\174\175\176\177\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\200\201\202\203\204\205\206\207\0\0\210\211\212\213\214\215\216\217\0\0\220\221\222\223\224\225\226\227\0\0\230\231\232\233\234\235\236\237\0\0\240\241\242\243\244\245\246\247\0\0\250\251\252\253\254\255"
;
function
chr(chr){
return
ascii_table.indexOf(chr);
}
function
ord(index){
return
ascii_table[index];
}
class charFreq
{
constructor(c, f)
{
this
.c = c
this
.f = f
}
}
function
swap(x, y)
{
return
[y, x]
}
function
toList(string)
{
let t = []
for
(let x of string)
t.push(x)
return
t
}
function
toString(l)
{
let res =
""
for
(let ele of l)
res += ele
return
res
}
function
maxHeapify(freq, i, heap_size)
{
let l = i*2 + 1
let r = i*2 + 2
let largest = i
if
(l < heap_size && freq[l].f > freq[i].f)
largest = l
if
(r < heap_size && freq[r].f > freq[largest].f)
largest = r
if
(largest != i)
{
let temp = freq[largest]
freq[largest] = freq[i]
freq[i] = temp
maxHeapify(freq, largest, heap_size)
}
}
function
buildHeap(freq, n)
{
let i = Math.floor((n - 1)/2)
while
(i >= 0)
{
maxHeapify(freq, i, n)
i -= 1
}
}
function
extractMax(freq, heap_size)
{
let root = freq[0]
if
(heap_size > 1)
{
freq[0] = freq[heap_size-1]
maxHeapify(freq, 0, heap_size-1)
}
return
root
}
function
rearrange(string, d)
{
let n = string.length
let freq = []
for
(
var
x = 0; x < MAX; x++)
freq.push(
new
charFreq(0, 0))
let m = 0
for
(
var
i = 0; i < n; i++)
{
let x = string[i].charCodeAt(0)
if
(freq[x].c == 0)
{
freq[x].c = String.fromCharCode(x)
m += 1
}
freq[x].f += 1
string[i] =
'\0'
}
buildHeap(freq, MAX)
for
(
var
i = 0; i < m; i++)
{
x = extractMax(freq, MAX-i)
let p = i
while
(string[p] !=
'\0'
)
p += 1
for
(
var
k = 0; k < x.f; k++)
{
if
(p + d*k >= n)
{
console.log (
"Cannot be rearranged"
)
return
}
string[p + d*k] = x.c
}
}
return
toString(string)
}
let string =
"aabbcc"
console.log(rearrange(toList(string), 3))