CF1656G Cycle Palindrome

题目描述

### 【前置定义】 1. 回文数列:如果一个长度为 $n$ 的数列 $a_{1\cdots n}$ 满足 $\forall i \in [1,n], a_{i}=a_{n-i+1}$,则称 $a_{1 \cdots n}$ 是回文的。 2. 循环数列:如果一个长度为 $n$ 的数列 $b_{1 \cdots n}$ 满足 $\{ 1,b(1),b^{2}(1),b^3(1) \cdots b^{n-1}(1)\}$ 两两不同,则称 $b_{1 \cdots n}$ 是循环数列。其中 $b^{m}(1)=\underbrace{b(b(\cdots b}_{m \ \text{times}}(1)\cdots))$,如 $b^{2}(1)=b(b(1))$。 3. 排列:对于一个长度为 $n$ 的数列 $c_{1 \dots n}$,如果 $1,2,3,\cdots,n$ 中的每一个数字**都**在 $c_{1 \cdots n}$ **恰好**只出现 $1$ 次,则称 $c_{1 \cdots n}$ 是一个长度为 $n$ 的排列。 给定一个长度为 $n$ 的数列 $a_{1 \cdots n}$,你需要找到一个**循环数列** $b_{1 \cdots n}$ 使得数列 $\{ a_{b_{1}},a_{b_{2}},a_{b_{3}}, \cdots,a_{b_{n}} \}$ 是一个**回文数列**且 $b$ 是一个长度为 $n$ 的**排列**。

输入格式

**多组数据**。 第一行输入一个整数 $T$,表示测试点数目。 对于每个测试点: - 第一行一个整数 $n$,表示数列长度。 - 第二行 $n$ 个整数,表示 $a_{1 \cdots n}$。

输出格式

对于每个测试点,如果存在这样的循环数列 $b_{1\cdots n}$,则输出两行:第一行输出一个 `YES`,第二行输出 $b_{1 \cdots n}$。如果有多个 $b_{1 \cdots n}$,输出任意一个即可。 如果不存在这样的 $b_{1 \cdots n}$,则只输出一行,输出 `NO`。

说明/提示

- $1 \leq T \leq 3 \times 10^{4}$。 - $1 \leq n \leq 2 \times 10^{5},1 \leq \sum n \leq 2 \times 10^{5}$。 - $\forall i \in [1,n], \quad 1 \leq a_{i} \leq n$。 Translated by @HPXXZYY