Techno Blender
Digitally Yours.

Max length of common interval whose Bitwise OR, AND are equal in both Arrays

0 44


#include <bits/stdc++.h>

using namespace std;

  

int orCalculate(int st, int length,

                vector<vector<int> >& bitPrefix)

{

    int val = 0;

    for (int j = 0; j < 32; j++) {

        int cnt

            = bitPrefix[st + length][j] - bitPrefix[st][j];

        if (cnt != 0)

  

            

            

            

            val += (1 << j);

    }

    return val;

}

  

int andCalculate(int st, int length,

                 vector<vector<int> >& bitPrefix)

{

    int val = 0;

    for (int j = 0; j < 32; j++) {

        int cnt

            = bitPrefix[st + length][j] - bitPrefix[st][j];

        if (cnt == length)

  

            

            

            

            val += (1 << j);

    }

    return val;

}

  

int largestLength(vector<int>& A, vector<int>& B)

{

    int N = A.size();

  

    

    

    vector<vector<int> > prefixBitSumA(N + 1,

                                       vector<int>(32, 0)),

        prefixBitSumB(N + 1, vector<int>(32, 0));

    for (int i = 0; i < N; i++) {

        for (int j = 0; j < 32; j++) {

            prefixBitSumA[i + 1][j]

                = ((A[i] & 1 << j) ? 1 : 0)

                  + prefixBitSumA[i][j];

            prefixBitSumB[i + 1][j]

                = ((B[i] & 1 << j) ? 1 : 0)

                  + prefixBitSumB[i][j];

        }

    }

  

    

    

    int ans = 0;

    for (int i = 0; i < N; i++) {

        int low = 0, high = N - i;

  

        

        while (low < high) {

            int mid = (low + high + 1) / 2;

            if (orCalculate(i, mid, prefixBitSumA)

                <= andCalculate(i, mid, prefixBitSumB))

                low = mid;

  

            

            else

                high = mid - 1;

        }

  

        

        

        

        

        

        if (orCalculate(i, low, prefixBitSumA)

            == andCalculate(i, low, prefixBitSumB))

            ans = max(ans, low);

    }

  

    

    return ans;

}

  

int main()

{

  

    vector<int> A = { 2, 1, 3, 3 };

  

    vector<int> B = { 15, 3, 7, 11 };

  

    

    cout << largestLength(A, B);

  

    return 0;

}


#include <bits/stdc++.h>

using namespace std;

  

int orCalculate(int st, int length,

                vector<vector<int> >& bitPrefix)

{

    int val = 0;

    for (int j = 0; j < 32; j++) {

        int cnt

            = bitPrefix[st + length][j] - bitPrefix[st][j];

        if (cnt != 0)

  

            

            

            

            val += (1 << j);

    }

    return val;

}

  

int andCalculate(int st, int length,

                 vector<vector<int> >& bitPrefix)

{

    int val = 0;

    for (int j = 0; j < 32; j++) {

        int cnt

            = bitPrefix[st + length][j] - bitPrefix[st][j];

        if (cnt == length)

  

            

            

            

            val += (1 << j);

    }

    return val;

}

  

int largestLength(vector<int>& A, vector<int>& B)

{

    int N = A.size();

  

    

    

    vector<vector<int> > prefixBitSumA(N + 1,

                                       vector<int>(32, 0)),

        prefixBitSumB(N + 1, vector<int>(32, 0));

    for (int i = 0; i < N; i++) {

        for (int j = 0; j < 32; j++) {

            prefixBitSumA[i + 1][j]

                = ((A[i] & 1 << j) ? 1 : 0)

                  + prefixBitSumA[i][j];

            prefixBitSumB[i + 1][j]

                = ((B[i] & 1 << j) ? 1 : 0)

                  + prefixBitSumB[i][j];

        }

    }

  

    

    

    int ans = 0;

    for (int i = 0; i < N; i++) {

        int low = 0, high = N - i;

  

        

        while (low < high) {

            int mid = (low + high + 1) / 2;

            if (orCalculate(i, mid, prefixBitSumA)

                <= andCalculate(i, mid, prefixBitSumB))

                low = mid;

  

            

            else

                high = mid - 1;

        }

  

        

        

        

        

        

        if (orCalculate(i, low, prefixBitSumA)

            == andCalculate(i, low, prefixBitSumB))

            ans = max(ans, low);

    }

  

    

    return ans;

}

  

int main()

{

  

    vector<int> A = { 2, 1, 3, 3 };

  

    vector<int> B = { 15, 3, 7, 11 };

  

    

    cout << largestLength(A, B);

  

    return 0;

}

FOLLOW US ON GOOGLE NEWS

Read original article here

Denial of responsibility! Techno Blender is an automatic aggregator of the all world’s media. In each content, the hyperlink to the primary source is specified. All trademarks belong to their rightful owners, all materials to their authors. If you are the owner of the content and do not want us to publish your materials, please contact us by email – [email protected]. The content will be deleted within 24 hours.

Leave a comment