Проблема подсчета по вопросу динамического программирования на основе 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;
}