1
配列の連続した部分配列から合計数を数える
すべてa [ i ] > 0の配列が与えられます。a[1…n]a[1…n]a[1 \ldots n]a[i]>0a[i]>0a[i]>0 今、私たちは部分配列は、配列、すなわち、連続した範囲のです(そのサブアレイから形成することができますどのように多くの異なる合計見つける必要がある[ J ... K ]いくつかのために、合計は全ての和でありますサブアレイの要素)。例えば、場合、その後、答えは4:我々が形成することができる。a[j…k]a[j…k]a[j\ldots k]j,kj,kj,ka=[1,2,1]a=[1,2,1]a=[1,2,1]1,2,3,41,2,3,4 1,2,3,4 時間で個別の合計数をカウントする方法を知っています。O(n2)O(n2)O(n^2) さらに、私はこれが文字列の異なる部分文字列の数を見つける必要がある古典的な問題に似ていることに気付きました。私は、サフィックス配列を構築し、同様の方法で解決する可能性を考えていました(時間)。しかし、私はここで動作するようにそれを変更する方法を理解することができませんでした。たとえば、接尾辞配列を使用すると、4つの許容可能なケースの代わりに5つのケースが取得されます。これは、接尾辞配列を使用してこれを行うことは可能ですか、それとも間違った方向に考えていますか?O(n)O(n)O(n)a=[1,2,1]a=[1,2,1]a=[1,2,1] また、私が考えてきたもう1つの方向があります。分割して征服します。配列を1つの要素に縮小されるまで毎回2つの部分に分割する場合のように。1つの要素に1つの合計を含めることができます。2つの単一要素を組み合わせる場合、2つの方法で実行できます。両方の単一範囲に同じ要素がある場合、2つの異なる合計を取得するか、両方に異なる要素がある場合、3つの異なる合計を取得します。しかし、長さが1より大きい配列をマージするためにこれを一般化することはできません。2つのmサイズの配列をマージして答えを取得することは可能ですか?O(m)O(m)O(m)