可以用vis[h][val] = k做;
用vis[h][val] = k;来压缩大于32的部分,保留h= n/32; n为集合编号
当然也可以直接用bitset做;
vis[h][val] = k 压缩的代码如下:
#include
#include
#include
#include
#include
using namespace std;
//这道题的点就是用位运算做了一个状态压缩,因为int型的数字只有32,而题目中给出的n的范围为1000
//所以要进行压缩,把大于32的部分用一个整数表示,小于32的部分用每一位上是否等于一来判断h* +k是否曾经存在过
int vis[50][10005];
int main()
{
int t;
scanf("%d",&t);
int n,tmp,h,k,maxx;
for(int i=0;i
bitset直接做的代码:
bitset 容器使用方法
http://blog.csdn.net/u010480899/article/details/52331363
#include
#include
#include
#include
#include
#include
#include
using namespace std;
bitset<1001>s[N];
int main()
{
int n,q,i,j,m,a,b;
scanf("%d",&n);
for(i=0;ih=s[a]&s[b];
if(h.count())
printf("Yes\n");
else
printf("No\n");
}
return 0;
}