transient sclass SingleTextWordIndex { S regexp = "\\w+"; new ElementInstanceMatrix wordMatrix; *(S text) { wordMatrix.instances = iotaZeroList(l(text)); for (IntRange r : regexpFindRanges(regexp, text)) wordMatrix.add(r.start, ll(upper(substring(text, r)))); } int[] indicesOfWordCombination(LPair wordsWithOffsets) { int n = l(wordsWithOffsets); if (n == 0) null; if (n == 1) ret intArray_minus(first(wordsWithOffsets).b, wordMatrix.instancesContainingElement_intArray(first(wordsWithOffsets).a); // get entries for words, exit when a word is unknown ElementInstanceMatrix.Entry[] entries = new[n]; for i to n: { Entry e = index.get(wordsWithOffsets.get(i).a); if (e == null) null; entries[i] = e; } // go through words again, shift & AND-combine all bit sets BitSet bs = leftShiftBitSet(wordsWithOffsets.get(0).b, cloneBitSet(entries[0].bitSet())); for (int i = 1; i < n; i++) bs.and(leftShiftBitSet(wordsWithOffsets.get(i).b, entries[i].bitSet()); ret bitSetToIntArray(bs); } }