hdu 4025 2011上海赛区网络赛E 压缩 ***

时间:2022-09-22 23:38:42

直接T了,居然可以这么剪枝

题解链接:点我

 #include<cstdio>
#include<map>
#include<cstring>
#define ll __int64
using namespace std;
ll a[],x[][],ans;
map<ll,ll>p;
void dfs(int d,int n,ll res,int f)
{
if(d==n){
if(f) p[res]++
if(res==) ans++;
return ;
}
for(int i=;i<=x[d][];i++)
{
ll temp=x[d][i]&a[d];
dfs(d+,n,temp^res);
}
}
int main()
{
int t,i,j,n,m,k;
ll temp=,te;
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
#endif
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
memset(a,,sizeof(a));
memset(x,,sizeof(x));
p.clear();
for(i=;i<n;i++)
for(j=;j<m;j++){
scanf("%I64d",&te);
if(te)
a[j]|=(temp<<(*i));
}
for(i=;i<m;i++){
scanf("%d",&x[i][]);
for(j=;j<=x[i][];j++){
scanf("%I64d",&te);
x[i][j]=te;
for(k=;k<n;k++){
x[i][j]|=(te<<(*k));
}
}
}
dfs(,m/,,);
dfs(m/,m,,);
printf("%I64d\n",ans);
}
return ;
}