比赛 2026.8.26 评测结果 AAAAAAAAATTTTTTTTTTT
题目名称 merge 最终得分 45
用户昵称 2_16鸡扒拌面 运行时间 23.851 s
代码语言 C++ 内存使用 3.82 MiB
提交时间 2026-08-26 12:39:57
显示代码纯文本
#include <bits/stdc++.h>
#define SNSNMO 110
using namespace std;

struct Op{
	int i,j,k;
};

int n;
vector<int> a0;
vector<Op> ans;
bool ok;
unordered_set<string> vis;

int xr(const vector<int>& v,int l,int r){
	int res=0;
	for(int i=l;i<=r;i++) res^=v[i];
	return res;
}

bool check(const vector<int>& v0,const vector<Op>& ops)
{
	vector<int> v=v0;
	for(auto &op:ops)
	{
		int i=op.i-1,j=op.j-1,k=op.k-1,m=v.size();
		if(i<0||j<0||k<0||i>=m||j>=m||k>=m) return false;
		if(i>=j||j>=k) return false;
		if((v[i]^v[j]^v[k])!=0) return false;
		int s=xr(v,i,k);
		vector<int> nv;
		for(int t=0;t<i;t++) nv.push_back(v[t]);
		nv.push_back(s);
		for(int t=k+1;t<m;t++) nv.push_back(v[t]);
		v=nv;
	}
	return v.size()==1;
}

string enc(const vector<int>& v)
{
	string s;
	for(int x:v)
	{
		s+=to_string(x);
		s+=',';
	}
	return s;
}

void dfs(vector<int>& v,vector<Op>& ops)
{
	if(ok) return;
	string key=enc(v);
	if(vis.count(key)) return;
	vis.insert(key);
	int m=v.size();
	if(m==1)
	{
		if(check(a0,ops))
		{
			ok=true;
			ans=ops;
		}
		return;
	}
	for(int i=0;i<m;i++) 
		for(int j=i+1;j<m;j++) 
		    for(int k=j+1;k<m;k++)
			{
				if((v[i]^v[j]^v[k])==0)
				{
					int s=xr(v,i,k);
					vector<int> nv;
					for(int t=0;t<i;t++) nv.push_back(v[t]);
					nv.push_back(s);
					for(int t=k+1;t<m;t++) nv.push_back(v[t]);
					ops.push_back({i+1,j+1,k+1});
					dfs(nv,ops);
					ops.pop_back();
					if(ok) return;
				}
			}
}

int main()
{
	freopen("mergeegrem.in","r",stdin);
	freopen("mergeegrem.out","w",stdout);
	int T;
	cin>>T;
	while(T--)
	{
		cin>>n;
		a0.resize(n);
		for(int i=0;i<n;i++) cin>>a0[i];
		ok=false;ans.clear();vis.clear();
		vector<Op> ops;
		vector<int> v=a0;
		dfs(v,ops);
		if(!ok)
			cout<<"Shuiniao\n";
		else
		{
			cout<<"Huoyu\n";
			cout<<ans.size()<<"\n";
			for(auto &op:ans) cout<<op.i<<" "<<op.j<<" "<<op.k<<"\n";
		}
	}
	return 0;
}