Удалось ещё больше ускорить программу.

Надо вместо

IF (begin + lens[w] <= end) & (source[begin] = words[w][0]) THEN

написать наоборот:

IF (source[begin] = words[w][0]) & (begin + lens[w] <= end) THEN

то есть сначала проверить совпадение первой буквы (в случае равномерного распределения с большей вероятностью буквы окажутся не равны чем равны).

Вариант на C#
## Код:
```
public static void MultiFind (byte[] s, int begin, int end, int wordCount, byte[][] words, int[] lens, out int word, out int pos)
{
  int w, j;
  word = -1; pos = -1;
  while (begin < end)
  {
    w = 0;
    while (w < wordCount)
    {
      if ((s[begin] == words[w][0]) && (begin + lens[w] <= end))
      {
        j = 1;
        while ((j < lens[w]) && (s[begin + j] == words[w][j]))
        {
          j++;
        }
        if (j == lens[w])
        {
          word = w; pos = begin;
          w = wordCount; begin = end;
        }
      }
      w++;
    }
    begin++;
  }
}
```

Работаетдо 2-х раз быстрееисходного варианта по "Дейкстре" в лучшем случае (текст очень длинный, а искомых слов мало) и на 30% быстрее в худшем случае (текст короткий, а искомых слов очень много).