HDU

题目链接

题意:n个数,你可以从中选一些数,也可以不选,选出来的元素的异或和大于m时,则称满足情况。问满足情况的方案数为多少。

分析:本来以为是用什么特殊的数据结构来操作,没想到是dp,还好队友很强。
定义dp[i][j]为在前i个数里选一些数的异或和为j的方案数,边计算边统计,

#include <iostream>
#include <cstdio>
#include <cstring>
typedef long long ll;
const int maxn=(1<<20);
using namespace std;
int dp[45][maxn];
int a[45];

int main()
{
//    freopen("da","r",stdin);
    int t;
    scanf("%d",&t);
    for(int kase=1;kase<=t;kase++){
        ll ans=0;
        int n,m;
        memset(dp,0,sizeof(dp));
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++) scanf("%d",&a[i]);
        dp[0][0]=1;
        if(m==0) ans++;
        for(int i=1;i<=n;i++){
            for(int j=0;j<maxn;j++){
                if(dp[i-1][j]==0) continue;
                dp[i][j]+=dp[i-1][j];
                int t=j^a[i-1];
                dp[i][t]+=dp[i-1][j];
                if(t>=m) ans+=dp[i-1][j];
            }
        }
        printf("Case #%d: %lld
",kase,ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/fht-litost/p/7260194.html