Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

นับแฝดที่สามารถสร้างสองอาร์เรย์ของ XOR ที่เท่ากันใน C ++


สมมติว่าเรามีอาร์เรย์ของจำนวนเต็ม arr เราต้องการเลือกดัชนีสามตัวเช่น i, j และ k โดยที่ (0 <=i

ดังนั้น หากอินพุตเป็น [2,3,1,6,7] ผลลัพธ์จะเป็น 4 เนื่องจากแฝดสามคือ (0,1,2), (0,2,2), (2,3 ,4) และ (2,4,4)

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • ยกเลิก :=0

  • n :=ขนาดของ arr

  • สำหรับการเริ่มต้น 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]

  • รีเทิร์น

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

#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