// almost same as FindInParfOfText_Prepared private Task <bool> FindInParfOfText(string text, int begin, int end) { return(Task.Run(() => { Node_Parallel current = root; for (int i = begin; i < end; ++i) { current = current.GetTransition(text[i]); if (current.IsTerminal || current.GetPressedSuffixLink() != root) { return true; } } return false; })); }
// almost same as IsOneOfStringsInText_Prepared public bool IsOneOfStringsInText(string text) { int maxThreadNumber = 3; int possibleFullParts = (int)Math.Ceiling((double)text.Length / maxWordLength); if (possibleFullParts >= 3) { int divideToParts = Math.Min(possibleFullParts - 1, maxThreadNumber); int subpartsInEachPart = (int)Math.Ceiling((double)(possibleFullParts + divideToParts - 1) / divideToParts); Task <bool>[] t = new Task <bool> [divideToParts]; for (int i = 0; i < divideToParts; ++i) { t[i] = FindInParfOfText( text, i * (subpartsInEachPart - 1) * maxWordLength, Math.Min(text.Length, (i + 1) * (subpartsInEachPart - 1) * maxWordLength + maxWordLength) ); } Task.WaitAll(t); return(t.Any(x => x.Result == true)); } else { Node_Parallel current = root; for (int i = 0; i < text.Length; ++i) { current = current.GetTransition(text[i]); if (current.IsTerminal || current.GetPressedSuffixLink() != root) { return(true); } } return(false); } }