comefrom: <gouthampradhan>hashing_SubstringConcatenationOfWords_1.java
code: public List<Integer> findSubstring(String s, String[] words) {
      if (words.length == 0) return new ArrayList<>();
      int wLen = words[0].length();
      int sLen = wLen * words.length;
      List<Integer> result = new ArrayList<>();
      if (sLen > s.length()) return result;
      Map<String, Integer> countMap = new HashMap<>();
      for (String w : words) {
        countMap.putIfAbsent(w, 0);
        countMap.put(w, countMap.get(w) + 1);
      }
      for (int k = 0; (s.length() - k) >= sLen; k++) {
        Map<String, Integer> subSMap = new HashMap<>();
        int i = k;
        for (int j = i + wLen; (i - k) < sLen; i = j, j += wLen) {
          String subS = s.substring(i, j);
          subSMap.putIfAbsent(subS, 0);
          subSMap.put(subS, subSMap.get(subS) + 1);
          if (!countMap.containsKey(subS) || subSMap.get(subS) > countMap.get(subS)) {
            break;
          }
        }
        if ((i - k) >= sLen) {
          result.add(k);
        }
      }
      return result;
    }
masked: public List < Integer > var_0 ( String var_1 , String [ ] var_2 ) {
    if ( var_2 . length == 0 ) return new ArrayList < > ( ) ;
    int var_3 = var_2 [ 0 ] . length ( ) ;
    int var_4 = var_3 * var_2 . length ;
    List < Integer > var_5 = new ArrayList < > ( ) ;
    if ( var_4 > var_1 . length ( ) ) return var_5 ;
    Map < String , Integer > var_6 = new HashMap < > ( ) ;
    for ( String var_7 : var_2 ) {
      var_6 . putIfAbsent ( var_7 , 0 ) ;
      var_6 . put ( var_7 , var_6 . get ( var_7 ) + 1 ) ;
    }
    for ( int var_8 = 0 ;
    ( var_1 . length ( ) - var_8 ) >= var_4 ;
    var_8 ++ ) {
      Map < String , Integer > var_9 = new HashMap < > ( ) ;
      int var_10 = var_8 ;
      for ( int var_11 = var_10 + var_3 ;
      ( var_10 - var_8 ) < var_4 ;
      var_10 = var_11 , var_11 += var_3 ) {
        String var_12 = var_1 . substring ( var_10 , var_11 ) ;
        var_9 . putIfAbsent ( var_12 , 0 ) ;
        var_9 . put ( var_12 , var_9 . get ( var_12 ) + 1 ) ;
        if ( ! var_6 . containsKey ( var_12 ) || var_9 . get ( var_12 ) > var_6 . get ( var_12 ) ) {
          break ;
        }
      }
      if ( ( var_10 - var_8 ) >= var_4 ) {
        var_5 . add ( var_8 ) ;
      }
    }
    return var_5 ;
  }
  