您的位置:首页 > 其它

[CF 612E]Square Root of Permutation

2018-01-24 20:44 393 查看
A permutation of length n is an array containing each integer from 1 to n exactly once. For example, q = [4, 5, 1, 2, 3] is a permutation. For the permutation q the square of permutation is the permutation p that p[i] = q[q[i]] for each i = 1... n. For example, the square of q = [4, 5, 1, 2, 3] is p = q2 = [2, 3, 4, 5, 1].

This problem is about the inverse operation: given the permutation p you task is to find such permutation q that q2 = p. If there are several such q find any of them.

Input

The first line contains integer n (1 ≤ n ≤ 106) — the number of elements in permutation p.

The second line contains n distinct integers p1, p2, ..., pn (1 ≤ pi ≤ n) — the elements of permutation p.

Output

If there is no permutation q such that q2 = p print the number "-1".

If the answer exists print it. The only line should contain n different integers qi (1 ≤ qi ≤ n) — the elements of the permutation q. If there are several solutions print any of them.

Examples

input

4
2 1 4 3


output

3 4 2 1


input

4
2 1 3 4


output

-1


input

5
2 3 4 5 1


output

4 5 1 2 3


题目大意:

给你个置换p,然后做平方运算,得到置换q,题目给你q,问你能否找到p,要构造出来。

题解:

这道题要求倒推出一个置换,由于原置换p中的环不一定全是奇数环,所以平方之后有可能有环会裂开。

对于平方后的置换q中的奇数环,直接在里面推。偶数环就看是否有相同大小的偶数环与它合并。

//Never forget why you start
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
int n,m,a[1000005],lm,ans[1000005],q[1000005];
struct node{
int sum;
vector<int>p;
friend bool operator < (const node a,const node b){
return a.sum<b.sum;
}
}s[1000005];
int vis[1000005],cnt;
void dfs(int r){
vis[r]=1;
cnt++;
s[lm].p.push_back(r);
if(vis[a[r]])return;
else dfs(a[r]);
}
int main(){
int i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d",&a[i]);
for(i=1;i<=n;i++)
if(!vis[i]){
cnt=0;
lm++;
dfs(i);
s[lm].sum=cnt;
}
sort(s+1,s+lm+1);
bool flag=0;
for(i=1;i<=lm;i++){
if(s[i].sum&1)continue;
else{
if(s[i+1].sum==s[i].sum){i++;continue;}
else {flag=1;break;}
}
}
if(flag){printf("-1\n");return 0;}
for(i=1;i<=lm;i++){
if(s[i].sum&1){
for(j=0;j<s[i].sum;j++)
q[j*2%s[i].sum]=s[i].p[j];
for(j=0;j<s[i].sum-1;j++)
ans[q[j]]=q[j+1];
ans[q[s[i].sum-1]]=q[0];
}
else{
int k=i+1;
for(j=0;j<s[i].sum;j++){
ans[s[i].p[j]]=s[k].p[j];
ans[s[k].p[j]]=s[i].p[(j+1)%s[i].sum];
}
i++;
}
}
for(i=1;i<=n;i++)
printf("%d ",ans[i]);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: