您的位置:首页 > 理论基础 > 计算机网络

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

2015-07-31 20:24 507 查看
直接T了,居然可以这么剪枝

题解链接:点我

#include<cstdio>
#include<map>
#include<cstring>
#define ll __int64
using namespace std;
ll a[23],x[23][5],ans;
map<ll,ll>p;
void dfs(int d,int n,ll res,int f)
{
if(d==n){
if(f)   p[res]++
if(res==0)  ans++;
return ;
}
for(int i=1;i<=x[d][0];i++)
{
ll temp=x[d][i]&a[d];
dfs(d+1,n,temp^res);
}
}
int main()
{
int t,i,j,n,m,k;
ll temp=3,te;
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
#endif
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
memset(a,0,sizeof(a));
memset(x,0,sizeof(x));
p.clear();
for(i=0;i<n;i++)
for(j=0;j<m;j++){
scanf("%I64d",&te);
if(te)
a[j]|=(temp<<(2*i));
}
for(i=0;i<m;i++){
scanf("%d",&x[i][0]);
for(j=1;j<=x[i][0];j++){
scanf("%I64d",&te);
x[i][j]=te;
for(k=1;k<n;k++){
x[i][j]|=(te<<(2*k));
}
}
}
dfs(0,m/2,0,1);
dfs(m/2,m,0,0);
printf("%I64d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: