hdu6085 手写bitset

来源:互联网 发布:神舟软件科技有限公司 编辑:程序博客网 时间:2024/05/29 07:38
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;typedef unsigned long long ull;const int maxn=50005;struct Bitset{    ull bit[1565];//开两倍的空间,50000/64*2    void reset()    {        memset(bit,0,sizeof(bit));    }    void flip(int pos)    {        bit[pos>>6]^=(ull)1<<(pos&63);    }    bool judge(int pos)    {        return bit[pos>>6]&((ull)1<<(pos&63));    }}a,ans;int b[maxn];ull pre[64];void init(){    pre[0]=1;    for(int i=1;i<64;i++)        pre[i]=pre[i-1]|((ull)1<<i);}int main(){    int t,n,m,q,i,j,mx;    init();    scanf("%d",&t);    while(t--&&scanf("%d%d%d",&n,&m,&q)!=EOF)    {        a.reset();        ans.reset();        mx=0;        for(i=0;i<n;i++)        {            int tp;            scanf("%d",&tp);            mx=max(mx,tp);            a.flip(tp);        }        for(i=0;i<m;i++)        {            scanf("%d",b+i);            for(j=0;j*b[i]<=mx;j++)            {                int ind1=(j*b[i])>>6,pos1=(j*b[i])&63,ind2=(j*b[i]+b[i]-1)>>6,pos2=(j*b[i]+b[i]-1)&63;//哈希                ull temp;                if(ind1==ind2)//分为三段                {                    temp=a.bit[ind1]>>pos1;                    temp&=pre[pos2-pos1];                    ans.bit[0]^=temp;                }                else                {                    int nowind=0,nowpos=63-pos1;                    temp=a.bit[ind1]>>pos1;                    temp&=pre[nowpos];                    ans.bit[0]^=temp;                    if(pos1==0)                        for(int k=ind1+1;k<ind2;k++)                            ans.bit[++nowind]^=a.bit[k];                    else                        for(int k=ind1+1;k<ind2;k++)                        {                            temp=a.bit[k]<<(nowpos+1);                            ans.bit[nowind++]^=temp;                            temp=a.bit[k]>>pos1;                            temp&=pre[nowpos];                            ans.bit[nowind]^=temp;                        }                    if(pos1==0)                        ans.bit[++nowind]^=a.bit[ind2]&pre[pos2];                    else if(pos2<pos1)                    {                        temp=a.bit[ind2]&pre[pos2];                        temp<<=(nowpos+1);                        ans.bit[nowind]^=temp;                    }                    else                    {                        temp=a.bit[ind2]<<(nowpos+1);                        ans.bit[nowind++]^=temp;                        temp=a.bit[ind2]>>pos1;                        temp&=pre[pos2-pos1];                        ans.bit[nowind]^=temp;                    }                }            }        }        for(i=0;i<q;i++)        {            int tp;            scanf("%d",&tp);            if(ans.judge(tp))                printf("1\n");            else                printf("0\n");        }    }    return 0;}

原创粉丝点击