基于XOR的动态编程问题的计数问题

时间:2018-12-27 08:41:45

标签: dynamic-programming bitwise-xor

对于一个问题,我们会给我们一个大小为n<10^5且每个0<=a[i]<10^9的数组,这是一个巨大的疑问。

我们必须计算方式,以使n个元素说b[i],以使每个0<=b[i]<=a[i]及其xor等于a[0]^a[1]..^a[n-1]的xor。所以我写了一个代码,可以为小输入提供正确的答案,并且我已经确定了dp的状态,所以现在我可以记住它了。但是当我惊讶地看到社论时,解决方案是基于逐位计算然后计数的。

所以,即使我们能记住为什么我们必须一点一点地做,这也是我的疑问。我们不能使用按位运算符来获取解决方案吗?
PS:link 编辑

#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;
}

#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 个答案:

没有答案