本地跑能对,cf评测上是WA。
实现有点抽象,,,
#include<bits/stdc++.h>
// #define int long long
#define inf 0x3f3f3f3f
#define linf 1e18
#define db double
#define ldb long double
#define F(i,a,b) for(int i=(a);i<=(b);i++)
// #define f(i,a,b) for(int i=(a);i>=(b);i--)
#define me(x,y) memset(x,y,sizeof x)
#define MAX(x,y) (x>y?x:y)
#define MIN(x,y) (x<y?x:y)
#define pii sd pair<int,int>
#define X first
#define Y second
#define Fr(a) for(auto it:a)
#define kg putchar(' ')
#define dbg(a) sd cout<<#a<<":"<<a<<sd endl
#define il inline
#define sd std::
il int read(){int w=1,c=0;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) c=(c<<3)+(c<<1)+ch-48;return w*c;}
void printt(int x){if(x>9) printt(x/10);putchar(x%10+48);}
void print(int x){if(x<0) x=-x,putchar('-');printt(x);}
void printk(int x){print(x);kg;}
void put(int x){print(x);puts("");}
const int N=2e5+10;
struct dsu
{
int fa[N];
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
void merge(int x,int y){int u=find(x),v=find(y);if(u==v) return;fa[u]=v;return;}
}D;
int n,p,cnt;
sd vector<int> v[N],st[N];
sd deque<pii> q;
pii b[N];
struct node
{
int nex;
int to;
}a[N<<1];
int tot,head[N];
void add(int u,int v)
{
a[++tot]={head[u],v};
head[u]=tot;
}
int vis[N],pos[N];
void dfs(int u)//找环
{
st[cnt].push_back(u);
pos[u]=cnt;
for(int i=head[u];i;i=a[i].nex)
{
int v=a[i].to;
if(vis[v]) return;
vis[v]=1;
dfs(v);
}
}
il void solve()
{
n=read();
tot=0;cnt=1;
F(i,1,n) v[i].clear(),st[i].clear(),head[i]=vis[i]=0,D.fa[i]=i;
F(i,1,n) v[read()].push_back(i);
int flag=0;pii c={0,0};
F(i,1,n)
{
if(v[i].size()&1)
{
if(flag) return puts("NO"),void();
else
{
flag=1;p=0;
Fr(v[i])
{
if(!c.Y) c={i,it};
else p?q.push_back({i,it}):q.push_front({i,it});
p=!p;
}
}
}
else
{
p=0;
Fr(v[i])
{
p?q.push_back({i,it}):q.push_front({i,it});
p=!p;
}
}
}
F(i,1,n)
{
if(!flag||(i!=n/2+1)) b[i]=q.front(),q.pop_front();
else b[i]=c;
}
F(i,1,n) add(i,b[i].Y);
F(i,1,n) if(!vis[i]) vis[i]=1,dfs(i),cnt++;
cnt--;
//1~cnt即为环
for(int i=1;i<=n-i+1;i++)//优化1
{
if(D.find(pos[b[i].Y])!=D.find(pos[b[n-i+1].Y]))
{
sd swap(b[i].Y,b[n-i+1].Y);
Fr(st[D.find(pos[b[i].Y])]) st[D.find(pos[b[n-i+1].Y])].push_back(it);
st[D.find(pos[b[i].Y])].clear();
D.merge(pos[b[i].Y],pos[b[n-i+1].Y]);
cnt--;
}
}
for(int i=2;i<=n-i+1;i++)
{
int j=i-1;
if((n&1)&&(i==(n+1)/2||j==(n+1)/2)) continue;
if(D.find(pos[b[i].Y])!=D.find(pos[b[j].Y]))
{
sd swap(b[i],b[j]);
sd swap(b[n-i+1],b[n-j+1]);
Fr(st[D.find(pos[b[j].Y])]) st[D.find(pos[b[i].Y])].push_back(it);
st[D.find(pos[b[j].Y])].clear();
D.merge(pos[b[i].Y],pos[b[j].Y]);
cnt--;
}
}
if(cnt==1)
{
puts("YES");
F(i,1,n) printk(b[i].Y);
puts("");
}
else puts("NO");
}
int main()
{
int T;
T=read();
while(T--) solve();
}