C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++で等しいXORの2つの配列を形成できるトリプレットを数える


整数の配列arrがあるとします。 i、j、kのような3つのインデックスを選択します。ここで、(0 <=i

したがって、入力が[2,3,1,6,7]の場合、トリプレットは(0,1,2)、(0,2,2)、(2,3)であるため、出力は4になります。 、4)および(2,4,4)

これを解決するには、次の手順に従います-

  • ret:=0

  • n:=arrのサイズ

  • 初期化i:=1の場合、i

    • 1つのマップを定義するm

    • x1:=0、x2:=0

    • 初期化j:=i --1の場合、j> =0の場合、更新(jを1つ減らす)、実行-

      • x1:=x1 XOR arr [j]

      • (m [x1]を1増やします)

    • 初期化j:=iの場合、j

      • x2:=x2 XOR arr [j]

      • ret:=ret + m [x2]

  • retを返す

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int countTriplets(vector<int>& arr) {
      int ret = 0;
      int n = arr.size();
      for (int i = 1; i < n; i++) {
         map<int, int> m;
         int x1 = 0;
         int x2 = 0;
         for (int j = i - 1; j >= 0; j--) {
            x1 = x1 ^ arr[j];
            m[x1]++;
         }
         for (int j = i; j < n; j++) {
            x2 = x2 ^ arr[j];
            ret += m[x2];
         }
      }
      return ret;
   }
};
main(){
   Solution ob;
   vector<int> v = {2,3,1,6,7};
   cout << (ob.countTriplets(v));
}

入力

{2,3,1,6,7}

出力

4

  1. C++でAPを形成するソートされた配列のすべてのトリプレットを出力します

    この問題では、並べ替えられた数値の配列が与えられ、算術プログレッションの形式のトリプレットを見つける必要があります。 等差数列 は、連続する用語間の差が同じである一連の数値です。 問題をよりよく理解するために例を見てみましょう- Input : array = {2 , 5 , 7, 8 , 9 , 10} Output : 2 5 8 5 7 9 7 8 9 8 9 10 この問題を解決するための簡単な解決策は、3つのループを実行し、すべてのトリプレットがAPにあるかどうかをチェックすることです。ただし、この方法では、n 3のオーダーの時間計算量があります。 。 より良い解決策は

  2. XORがC++の別の配列と等しくなるように、2つのバイナリ配列の最小フリップ。

    問題の説明 サイズnの0と1の3つの配列が与えられた場合、タスクは、1番目と2番目の配列のi番目のインデックスビットのXORがi番目のインデックスビットと等しくなるように、1番目と2番目の配列のビットの最小フリップを見つけることです。 3番目の配列。 反転できるのは、配列1の最大pビットと配列2の最大qビットのみであることに注意してください。また、配列要素の再配置は許可されていません。 p=2およびq=5と仮定します arr1[] = {1, 0, 1, 1, 0, 1, 0} arr2[] = {0, 1, 0, 1, 0, 0, 1} arr3[] = {0, 1, 1, 0, 0,