SINR-maximizing spreading code allocation for non-linear serial interference cancellation