求调(有具体原因)
查看原帖
求调(有具体原因)
800499
suzhikz楼主2024/8/15 22:19

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;
}
2024/8/15 22:19
加载中...