কম্পিউটার টিউটোরিয়াল

C++ প্রোগ্রাম: XOR ফলাফল যোগফলের সমান হয় এমন (l,r) জোড়ার সংখ্যা গণনা

মান লিখুন: আমাদের কাছে N উপাদান বিশিষ্ট একটি অ্যারে A রয়েছে। আমাদের l এবং r-এর জোড়ার সংখ্যা বের করতে হবে যাতে A[l] XOR A[l+1] XOR ... XOR A[r] = A[l] + A[l+1] + ... + A[r]।

উদাহরণ

যদি ইনপুট হয় A = [2, 5, 4, 6], তবে আউটপুট হবে 5, কারণ জোড়াগুলো: (1,1), (2,2), (3,3), (4,4) এবং (1,2)।

সমাধানের ধাপসমূহ

n := A এর আকার
a, s, sx অ্যারে (আকার n+1)
for i := 1 থেকে n:
    a[i] := A[i-1]
    s[i] := s[i-1] + a[i]
    sx[i] := sx[i-1] XOR a[i]
res := 0
for l := 1 থেকে n:
    bg := l, en := n, r := l
    যতক্ষণ bg <= en:
        mid := (bg + en) / 2
        যদি s[mid] - s[l-1] == (sx[mid] XOR sx[l-1]):
            r := mid
            bg := mid + 1
        অন্যথায়:
            en := mid - 1
    res := res + (r - l + 1)
res রিটার্ন করুন

C++ বাস্তবায়ন

#include <bits/stdc++.h>
using namespace std;

int solve(vector<int> A) {
    int n = A.size();
    vector<int> a(n + 1), s(n + 1), sx(n + 1);
    for (int i = 1; i <= n; i++) {
        a[i] = A[i - 1];
        s[i] = s[i - 1] + a[i];
        sx[i] = sx[i - 1] ^ a[i];
    }
    int res = 0;
    for (int l = 1; l <= n; l++) {
        int bg = l, en = n, r = l;
        while (bg <= en) {
            int mi = (bg + en) / 2;
            if (s[mi] - s[l - 1] == (sx[mi] ^ sx[l - 1])) {
                r = mi;
                bg = mi + 1;
            } else
                en = mi - 1;
        }
        res += (r - l + 1);
    }
    return res;
}

int main() {
    vector<int> A = { 2, 5, 4, 6 };
    cout << solve(A) << endl;
}

ইনপুট

{ 2, 5, 4, 6 }

আউটপুট

5
  1. C++ প্রোগ্রাম: একটি নম্বরের অড ফ্যাক্টরগুলোর যোগফল বের করা

  2. সি++ প্রোগ্রাম: D দিয়ে বিভাজ্য N অঙ্কের সংখ্যা খুঁজে বের করা

  3. C++ প্রোগ্রাম: হেক্সাডেসিমেল থেকে ডেসিমেল কনভার্সন

  4. পাইথনে প্রথম ও শেষ জোড়ার গুণফল সমান হয় এমন চতুর্দল (quadruples) সংখ্যা বের করার প্রোগ্রাম