Проблема подсчета по вопросу динамического программирования на основе XOR - PullRequest
0 голосов
/ 27 декабря 2018

Существует огромное сомнение в отношении проблемы, которая говорит о том, что нам будет дан массив размером 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: ссылка на редакцию </p> <pre><code>#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; }

...