xxx

 
#include<cstdio>
#include<cstring>
#include<queue>
#define zhi 1999993
#define inf 2000000
using namespace std;
struct zhangzijian
{
    int wo,pre,bug,pt;
}miao,h[inf];
int pt[100][2],num,data[100],n,m;
bool done[inf],*p;
int answer[100],ans,ans_hash,hash;
int bint(int n)
{
    n&=0xffffffff;
    n=(n&0x55555555)+((n>>1)&0x55555555);
    n=(n&0x33333333)+((n>>2)&0x33333333);
    n=(n&0x0f0f0f0f)+((n>>4)&0x0f0f0f0f);
    n=(n&0x00ff00ff)+((n>>8)&0x00ff00ff);
    n=(n&0x0000ffff)+((n>>16)&0x0000ffff);
    return n;
}
int getnums(int s[])
{
    char c;
    int num = 0,pos=0;
    while(1){
        num=0;
        while(c=getchar())
            if(c<='9'&&c>='0' && c!='\n') break;
        while(c<='9'&&c>='0'){
            num=num*10+c-'0';
            c = getchar();
        }
        s[++pos]=num;
        if(c=='\n') break;
    }
    return pos;
}
int pd0()
{
    int ret=0xffffffff;
    for(int i=1;i<=num;i++)
        ret^=1<<(data[i]-1);
    return ret;
}
int pd1()
{
    int ret=0x00000000;
    for(int i=1;i<=num;i++)
        ret|=1<<(data[i]-1);
    return ret;
}
void sou(int hash)
{
    int i=0,j;
    while (h[hash].pt){
        answer[i]=h[hash].pt^h[h[hash].pre].pt;
        j=0;
        while (answer[i]){
           answer[i]>>=1;
           j++;
        }
        answer[i++]=j;
        hash=h[hash].pre;
    }
}
int main()
{
    freopen("in","r",stdin);
    freopen("out","w",stdout);
    scanf("%d%d",&n,&m);
    getchar();
    ans=num=getnums(data);
    queue<int> q;
    h[pd1()%zhi].bug=pd1();
    q.push(pd1()%zhi);
    for(int i=1;i<=n;i++){
        num=getnums(data);
        pt[i][0]=pd0();
        num=getnums(data);
        pt[i][1]=pd1();
    }
    while(!q.empty()){
        int now=q.front();
        q.pop();
        int i=-1;
        while(i<n-1){
            int pre=h[now].pre,bug=h[now].bug,patch=h[now].pt;
            i++;
            if((patch>>i)&1)continue;
            patch|=1<<i;
            int tmp;
            bug&=pt[i+1][0];
            bug|=pt[i+1][1];
            hash=bug%zhi;
            if(done[hash]){
                int zeng=0;
                while(1){
                    if(done[(hash+zeng)%inf]==0 || h[(hash+zeng)%inf].bug==bug)
                        break;
                    zeng=-zeng;
                    if(done[(hash+zeng)%inf]==0 || h[(hash+zeng)%inf].bug==bug)
                        break;
                    zeng=-zeng+1;
                }
                if(h[(hash+zeng)%inf].bug==bug)
                    continue;
                hash=(hash+zeng)%inf;
            }

            done[hash]=1;
            if((tmp=bint(bug))<ans){
                ans=tmp;
                ans_hash=hash;
            }
            if(tmp==0) break;
            h[hash].wo=hash;h[hash].pre=now;h[hash].bug=bug;h[hash].pt=patch;
            q.push(hash);
        }
    }
    sou(ans_hash);
    if(answer[0]==0){
        printf("0\n");
        return 0;
    }
    printf("%d\n",ans);
    for(int i=30;i>0;i--) if(answer[i])
        printf("%d ",answer[i]);
    printf("%d\n",answer[0]);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值