この問題を解決するために使用できる高速なアルゴリズムを探しています。A と B の整数 ([0,10^18] の範囲) を指定し、N (N<=1000) の数値部分文字列のリストを指定します。目標は、N 個の部分文字列のいずれかを含む範囲 [A,B] 内のすべての数値をカウントすることです。常に A<=B であり、数値部分文字列も [0,10^18] の範囲の整数です。
例 1: A=10、B=22 の場合、N=2 部分文字列={1,10} を指定した場合。カウントは = 11 になります。数を数えます: 10->19 と 21.
例 2: A=175、B=201、および N=3 substrings={55,0,200} を指定した場合。カウントは = 4 になります。数を数えます: 180、190、200、201。
簡単な方法は、範囲 [A,B] 内の各整数を次々に分析することですが、範囲が非常に大きくなる可能性があるため (10^18 整数まで)、解決策ではありません。
問題の複雑さを軽減するために私が最初にしたことの 1 つは、「別の部分文字列が含まれていない」ように、N 個の部分文字列の元のリストからいくつかの役に立たない部分文字列を削除することです。例: {1,10} は {1} になり、{55,0,200} は {55,0} になります。これは最終的なカウントを変更しません。
次に、範囲 [A,B] 内の 1 つの部分文字列のカウントを取得できると仮定しても、このカウントをリストの他の部分文字列のカウントと合計することはできません。一度。
問題を解決して必要な数を取得するためのアイデアはありますか?