Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

सी ++ सभी सबएरे के एक्सओआर के एक्सओआर पर प्रश्न

दी गई रेंज में मौजूद सभी सबएरे के एक्सओआर की गणना करने और उसे प्रिंट करने के लिए। उदाहरण के लिए

Input : arr[] = { 4, 1, 2, 3, 5 }, Q = 3

Queries

q1 = { 1, 2 }
q2 = { 2, 4 }
q3 = { 1, 4 }

Output : 0
2
0
Explanation : As the given problem states that we need to find XOR of all the subarrays present in the given range so as for query 2 the subarrays are :
{1}, {2}, {3}, {1, 2}, {2, 3}, (1, 2, 3}
So as you can see the number of occurrences of elements are :
1 is present 3 times
2 is present 4 times
3 is present 3 times
Now as we know the property of XOR is that the numbers that are present an even number of times get canceled out so out 2 got canceled out and just the XOR of 3 and 1 remained and that was our answer.

हमें इस समस्या में बनने वाले पैटर्न का निरीक्षण करने की आवश्यकता है, और फिर हमें उसी के अनुसार इसे लागू करने की आवश्यकता है।

समाधान खोजने के लिए दृष्टिकोण

इस समस्या में, हम समस्या में मौजूद बीच के पैटर्न को खोजने की कोशिश कर रहे हैं। कब। जब हम उस पैटर्न को देखते हैं, तो हम उसी के अनुसार इसे लागू करते हैं और परिणामों की जांच करते हैं।

उदाहरण

उपरोक्त दृष्टिकोण के लिए C++ कोड

 
#include <bits/stdc++.h>
using namespace std;
void ansQueries(int prefeven[], int prefodd[], int l, int r){
    if ((r - l + 1) % 2 == 0) // if number of element present in the range is even
        cout << "0";
    else{
        if (l % 2 == 0) // if l is even
            cout << (prefeven[r] ^ prefeven[l - 1]) << "\n";
        else // if l is odd
            cout << (prefodd[r] ^ prefodd[l - 1]) << "\n";
    }
}
int main(){
    int arr[] = {4, 1, 2, 3, 5};
    int n = sizeof(arr) / sizeof(int); // size of our array
    int l[] = {1, 2, 1}; // given queries' left index
    int r[] = {2, 4, 4}; // given queries' right index
    int q = sizeof(l) / sizeof(int);         // number of queries asked
    int prefodd[n] = {0}, prefeven[n] = {0}; // different prefix xor for even and odd indices
    for (int i = 1; i <= n; i++){
        if ((i) % 2 == 0){ // if i is even then we change prefeven
            prefeven[i] = arr[i - 1] ^ prefeven[i - 1];
            prefodd[i] = prefodd[i - 1];
        }else{
            prefeven[i] = prefeven[i - 1];
            prefodd[i] = prefodd[i - 1] ^ arr[i - 1];
        }
    }
    for (int i = 0; i < q; i++){
        ansQueries(prefeven, prefodd, l[i], r[i]);
    }
    return 0;
}

आउटपुट

02
0

उपरोक्त कोड की व्याख्या

इस दृष्टिकोण में, हम पहले यह देखते हैं कि यदि हमारी सीमा का आकार सम है तो हमारा उत्तर शून्य होगा क्योंकि जब हम सभी उपसरणियों को प्रिंट करते हैं तो हर संख्या सम बार दिखाई देती है, इसलिए उनके XOR को लेने से हमारे अगले भाग के लिए उत्तर केवल 0 होगा। जहां इस मामले में सीमा का आकार विषम है, विषम समय दिखाई देने वाली संख्या दी गई सीमा में सम स्थिति में होती है और हमारा उत्तर केवल दी गई श्रेणी दो में सम स्थिति में दिखाई देने वाली संख्याओं का XOR होगा, हम दो उपसर्ग बनाए रखते हैं सरणियाँ जिनमें वैकल्पिक पदों के XOR होते हैं क्योंकि हमारे प्रीफ़ेवेन में सभी सम सूचकांकों का XOR होता है और प्रीफ़ोड में सभी विषम सूचकांकों के XOR होते हैं, जब हम एक प्रश्न हल करते हैं तो हमें बस यह जाँचने की आवश्यकता होती है कि क्या हमारा l सम या विषम है और उसी के अनुसार अपना उत्तर दें ।

निष्कर्ष

इस ट्यूटोरियल में, हम सभी सबएरे के एक्सओआर के एक्सओआर पर प्रश्नों को हल करने के लिए एक समस्या का समाधान करते हैं। हमने इस समस्या के लिए C++ प्रोग्राम और संपूर्ण दृष्टिकोण (Normal) भी सीखा जिसके द्वारा हमने इस समस्या को हल किया। हम उसी प्रोग्राम को अन्य भाषाओं जैसे सी, जावा, पायथन और अन्य भाषाओं में लिख सकते हैं। हमें उम्मीद है कि आपको यह ट्यूटोरियल मददगार लगा होगा।


  1. C++ में दिए गए XOR के साथ सभी जोड़ियों की गणना करें

    इस ट्यूटोरियल में, हम दिए गए XOR के साथ युग्मों की संख्या ज्ञात करने के लिए एक प्रोग्राम पर चर्चा करेंगे। इसके लिए हमें एक सरणी और एक मान प्रदान किया जाएगा। हमारा काम उन युग्मों की संख्या ज्ञात करना है जिनका XOR दिए गए मान के बराबर है। उदाहरण #include<bits/stdc++.h> using namespace std; //ret

  1. C++ में किसी सरणी के सभी त्रिक के बीच XOR का अधिकतम मान

    इस समस्या में, हमें पूर्णांकों की एक सरणी दी जाती है। हमारा काम एक सरणी के सभी ट्रिपल के बीच XOR का अधिकतम मान बनाना है। समस्या को समझने के लिए एक उदाहरण लेते हैं, इनपुट - सरणी ={5, 6, 1, 2} आउटपुट -6 स्पष्टीकरण - All triplets are: 5^6^1 = 2 5^6^2 = 1 5^1^2 = 6 6^1^2 = 5 इस समस्या को हल करने के

  1. C++ में 0 योग के साथ सभी उप-सरणी मुद्रित करें

    इस समस्या में, हमें पूर्णांक मानों की एक सरणी दी जाती है और हमें इस सरणी से उन सभी उप-सरणी को प्रिंट करना होता है जिनका योग 0 के बराबर होता है। आइए विषय को बेहतर ढंग से समझने के लिए एक उदाहरण लेते हैं, Input: array = [-5, 0, 2, 3, -3, 4, -1] Output: Subarray with sum 0 is from 1 to 4. Subarray with