code: private Splitter<I, D> findSplitter(AbstractBaseDTNode<I, D> blockRoot) {
          int alphabetSize = alphabet.size();
  
          Object[] properties = new Object[alphabetSize];
          @SuppressWarnings("unchecked")
          AbstractBaseDTNode<I, D>[] lcas = new AbstractBaseDTNode[alphabetSize];
          boolean first = true;
  
          for (TTTState<I, D> state : blockRoot.subtreeStates()) {
              for (int i = 0; i < alphabetSize; i++) {
                  TTTTransition<I, D> trans = state.getTransition(i);
                  if (first) {
                      properties[i] = trans.getProperty();
                      lcas[i] = trans.getDTTarget();
                  } else {
                      if (!Objects.equals(properties[i], trans.getProperty())) {
                          return new Splitter<>(i);
                      }
                      lcas[i] = dtree.leastCommonAncestor(lcas[i], trans.getDTTarget());
                  }
              }
              first = false;
          }
  
          int shortestLen = Integer.MAX_VALUE;
          AbstractBaseDTNode<I, D> shortestLca = null;
          int shortestLcaSym = -1;
  
          for (int i = 0; i < alphabetSize; i++) {
              AbstractBaseDTNode<I, D> lca = lcas[i];
              if (!lca.isTemp() && !lca.isLeaf()) {
                  int lcaLen = lca.getDiscriminator().length();
                  if (shortestLca == null || lcaLen < shortestLen) {
                      shortestLca = lca;
                      shortestLen = lcaLen;
                      shortestLcaSym = i;
                  }
              }
          }
  
          if (shortestLca != null) {
              return new Splitter<>(shortestLcaSym, shortestLca);
          }
          return null;
      }
docs: Determines a (local) splitter for a given block. This method may (but is not required to) employ heuristics to
  obtain a splitter with a relatively short suffix.
  
  @param blockRoot
  the root of the block
  
  @return a splitter for this block, or {@code null} if no such splitter could be found.