二进制集合题

可以用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;
}


你可能感兴趣的:(二进制集合题)