code: @Override
      public final int[] buildSuffixArray(int[] input, int start, int length) {
          Tools.assertAlways(input != null, "input must not be null");
          Tools.assertAlways(length >= 2, "input length must be >= 2");
          MinMax mm = Tools.minmax(input, start, length);
          Tools.assertAlways(mm.min >= 0, "input must not be negative");
          Tools.assertAlways(mm.max < ALPHABET_SIZE, "max alphabet size is " + ALPHABET_SIZE);
  
          final int[] ret = new int[length];
          this.SA = ret;
          this.T = input;
          int[] bucket_A = new int[BUCKET_A_SIZE];
          int[] bucket_B = new int[BUCKET_B_SIZE];
          this.start = start;
          /* Suffixsort. */
          int m = sortTypeBstar(bucket_A, bucket_B, length);
          constructSuffixArray(bucket_A, bucket_B, length, m);
          return ret;
      }
docs: {@inheritDoc}
  <p>
  Additional constraints enforced by DivSufSort algorithm:
  <ul>
  <li>non-negative (&ge;0) symbols in the input</li>
  <li>symbols limited by alphabet size passed in the constructor.</li>
  <li>length &gt;= 2</li>
  </ul>
  <p>