我要妹子。
题意
给定
多测,
题解
我的做法好麻烦不知道有没有高论喵。
设
首先如果
然后如果
否则我们有一种除了
所以我们现在的目标是判断能否全部出现的位都是
一个最简单的情况是
否则的话我们可以断言,每次与操作后面跟着的数都是相同的,假设是
然后只要模拟一下就行了叭。
代码
int T,n,x,y,z,c,cc,a[N],buc[N];
#define _(X,a,b) op##X.pb(a),nums##X.pb(b),buc[b]--,(a=='&'?x:a=='|'?y:z)--
#define AA(i) _(A,'&',i)
#define AO(i) _(A,'|',i)
#define AX(i) _(A,'^',i)
#define BA(i) _(B,'&',i)
#define BO(i) _(B,'|',i)
#define BX(i) _(B,'^',i)
#define rev(X) reverse((X).begin(),(X).end())
signed main(){
read(T);for(int testcase=1;testcase<=T;testcase++){
read(n,x,y,z);for(int i=0;i<n;i++)buc[i]=0;
for(int i=1;i<=n;i++)read(a[i]),buc[a[i]]++;
vector<int>opA,numsA,opB,numsB;
if(x==0){
for(int i=n-1;~i;i--)if(buc[i]){
if(buc[i]%2||y){
pc('1');int _=buc[i]%2?0:1;
while(buc[i]>_&&z)AX(i);
while(buc[i])AO(i);
}else{pc('0');while(buc[i])AX(i);}
}else pc('0');
goto end;
}else{
c=cc=0;for(int i=0;i<n;i++)c+=buc[i]>0,cc+=buc[i]>1;
if(y+z<c){
for(int i=n-1;~i;i--)if(buc[i]&&(y||z)){
pc('1');if(y)BO(i);else BX(i);
}else pc('0');
goto end;
}
if(x>=2&&cc>=2){
for(int i=0;i<n;i++)if(buc[i]>1)for(int j=i+1;j<n;j++)if(buc[j]>1){
BA(i);BA(j);
for(int k=n-1;~k;k--)if(buc[k]){
pc('1');if(y)BO(k);else BX(k);
}else pc('0');
goto end;
}
}
for(int i=0;i<n;i++)if(buc[i]>x&&(y||(buc[i]-x)%2)){
for(int j=n-1;~j;j--)if(buc[j]){
pc('1');if(i!=j){if(z)BX(j);else BO(j);}
}else pc('0');
if(y){BA(i);rev(opB);rev(numsB);BO(i);}
else{while(x)BA(i);rev(opB);rev(numsB);while(buc[i])BX(i);}
goto end;
}
for(int mn=0;mn<n;mn++)if(buc[mn]){
for(int j=n-1;~j;j--)pc('0'+(buc[j]&&j!=mn));
BA(mn);
for(int j=0;j<n;j++)if(buc[j]&&j!=mn){if(y)BO(j);else BX(j);}
goto end;
}
}
end:pc('\n');
for(int i=0;i<n;i++)while(buc[i]){if(x)AA(i);else if(y)AO(i);else AX(i);}
for(uint i=0;i<opA.size();i++)pc(opA[i]);
for(uint i=0;i<opB.size();i++)pc(opB[i]);
pc('\n');
for(uint i=0;i<numsA.size();i++)write(numsA[i]),pc(' ');
for(uint i=0;i<numsB.size();i++)write(numsB[i]),pc(' ');
pc('\n');
}
}