def get_score_hc_fast(n_alpha: np.ndarray, no_records: np.ndarray, alpha: np.ndarray) -> np.ndarray:
        """
        HigherCriticism
        Similar to a traditional wald test statistic: (Observed - expected) / standard deviation.
        In this case we use the binomial distribution. The observed is N_a. The expected (under null) is N*a
        and the standard deviation is sqrt(N*a(1-a)).

        :param n_alpha: Number of records less than alpha.
        :param no_records: Number of records.
        :param alpha: Alpha threshold.
        :return: Score.
        """
        score = np.zeros(alpha.shape[0])
        inds = n_alpha > no_records * alpha
        factor1 = n_alpha[inds] - no_records[inds] * alpha[inds]
        factor2 = np.sqrt(no_records[inds] * alpha[inds] * (1.0 - alpha[inds]))
        score[inds] = np.true_divide(factor1, factor2)
        return score

        HigherCriticism
        Similar to a traditional wald test statistic: (Observed - expected) / standard deviation.
        In this case we use the binomial distribution. The observed is N_a. The expected (under null) is N*a
        and the standard deviation is sqrt(N*a(1-a)).

        :param n_alpha: Number of records less than alpha.
        :param no_records: Number of records.
        :param alpha: Alpha threshold.
        :return: Score.
        
art/defences/detector/evasion/subsetscanning/scoring_functions.py