Проблема подсчета по вопросу динамического программирования на основе XOR

Существует огромное сомнение относительно проблемы, которая говорит, что нам дали бы массив размера n<10^5 и каждый 0<=a[i]<10^9,

Мы должны сосчитать пути так, чтобы n элементов говорили b[i] так, что каждый 0<=b[i]<=a[i] и их XOR равен XOR из a[0]^a[1]..^a[n-1], Поэтому я написал код, который дает правильный ответ для небольших входных данных, и я определил состояния dp, чтобы теперь я мог запомнить его, но когда я увидел редакцию, к своему удивлению, решение было основано на побитовом вычислении и затем подсчете.

Итак, вот мое сомнение, даже если мы можем сделать запоминание, почему мы должны делать по крупицам? Разве мы не можем использовать побитовые операторы и получить решение?
PS: ссылка на редакцию

#include <bits/stdc++.h>
using namespace std;
int ans(int *a,int n,int level,int cur,int xor_val)
{
    if(level==n)
    {
        if(cur==xor_val)
        {
            return 1;
        }
        return 0;
    }
    int cnt=0;
    for(int i=0;i<=a[level];i++)
    {
        if(level==0)
        {
            cur=i;
            cnt+=ans(a,n,level+1,cur,xor_val);
        }
        else
        {
            cnt+=ans(a,n,level+1,cur^i,xor_val);
        }
    }
    return cnt;
}

int main()
{
    int *a,n,t;
    cin>>t;
    while(t--)
    {
        cin>>n;
        a=new int[n];
        int xor_val;
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
            if(i==0)
            xor_val=a[i];
            else
            xor_val^=a[i];
        }
        int cur;
        cout<<ans(a,n,0,cur,xor_val)<<"\n";
    }
    return 0;
}

0 ответов

Другие вопросы по тегам