BASH , 580 349 308 303 291 286 283 277 275 272 275271 bytes
Found this very entertaining, thanks! First variant was 580 bytes, then 349, ..., now 275271:
s=$1 n=$2 N=$[n+n-1];f(){ b=$1;for((j=1;j<n;j++));{((c<N))&&T+=%s;[[ $4 ]]&&h=$4 S[i+$2/2]=-;t=${s:c:1} S[i]=${t:-$b} b=$3;((i+=$2b=$3;$[i+=$2,c++));S[ic++];S[i-($2/N)]=\ ;};};while((n>0));do f . 2 - \>;((n\>;$[n-=a));f=a];f . $N \|;f \' -2 - \<;((n\<;$[n--));f];f \' -$N \|;a=1;done;S[i]=$h;printf "$T\n"$T\\n "${S[@]}"
Squeezed to 275271(with 2>/dev/null
):
#!/bin/bash
s=$1 n=$2 N=$[n+n-1]
f(){
b=$1
for((j=1;j<n;j++)); {
((c<N))&&T+=%s
[[ $4 ]]&&h=$4 S[i+$2/2]=-
t=${s:c:1} S[i]=${t:-$b} b=$3
((i+=$2$[i+=$2,c++))c++]
S[i-($2/N)]=\
}
}
while((n>0));do
f . 2 - \>; ((n$[n-=a))=a]
f . $N \|
f \' -2 - \<; ((n$[n--))]
f \' -$N \| ; a=1
done;S[i]=$h;printf "$T\n" "${S[@]}"
And if we run script with 2>/dev/null
we can squeezed it up to 272:
s=$1 n=$2 N=$[n+n-1];f(){ b=$1;for((j=1;j<n;j++));{((c<N))&&T+=%s;[[ $4 ]]&&h=$4 S[i+$2/2]=-;t=${s:c:1} S[i]=${t:-$b} b=$3;$[i+=$2,c++];S[i-($2/N)]=\ ;};};while((n>0));do f . 2 - \>;$[n-=a];f . $N \|;f \' -2 - \<;$[n--];f \' -$N \|;a=1;done;S[i]=$h;printf "$T\n"$T\\n "${S[@]}"