WAon#33 说输出的不构成排列
#include<bits/stdc++.h>
using namespace std;
const int N=400005;
int n,a[N];
bool vis[N],vis_q[N];
int p[N],g[N];
int us[N],tot;
int tmp[N];
int summ;
int main(){
srand(time(0));
cin>>n;
n=(1<<n);
for(int i=1;i<=n;i++){
cin>>a[i];
summ^=a[i];
us[i]=i-1;
}
if(summ==0){
puts("Shi");
}else{
puts("Fou");
return 0;
}
tot=n;
while(tot){
int pos=(rand()-1)%tot+1,w=us[pos];
tmp[0]=0;
if(pos!=tot){
us[pos]=us[tot];
}
tot--;
int flag=0;
// cout<<tot<<endl;
// for(int i=1;i<=n;i++)
// cout<<vis[i]<<' ';
// cout<<endl;
for(int i=1;i<=n;i++){
if(!vis[i]&&!vis_q[a[i]^w]){
vis[i]=1;
vis_q[a[i]^w]=1;
flag=1;
g[a[i]^w]=i;
p[i]=w;
break;
}else if(!vis[i]){
tmp[0]++;
tmp[tmp[0]]=i;
}
}
if(flag==0){
//cout<<tmp[0]<<endl;
int pos2=(rand()-1)%tmp[0]+1;pos2=tmp[pos2];
p[pos2]=w;
vis[pos2]=1;
int c=g[a[pos2]^w];
vis[c]=0;
us[++tot]=p[c];
p[c]=0;
g[a[pos2]^w]=pos2;
}
}
for(int i=1;i<=n;i++){
cout<<p[i]<<' ';
}
cout<<endl;
//不是排列
for(int i=1;i<=n;i++){
printf("%d ",p[i]^a[i]);
}
return 0;
}