构造,先根据h(g(x))=f(x)。m就是f(x)中不相同的个数,h(x)就是f(x)中不相同的数,g(x)就是f(x)在所有数种排第几。然后根据g(h(x))=x判断这个解对不对即可。
#include<iostream>
using namespace std;
int f[100005];
int h[100005];
int g[100005];
int ff[100005];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)
{
scanf("%d",&f[i]);
}
int m=0;
for(int i=1;i<=n;i++)
{
if(ff[f[i]]==0)
{
m++;
h[m]=f[i];
ff[f[i]]=m;
}
g[i]=ff[f[i]];
}
int f=1;
for(int i=1;i<=m;i++)
{
if(g[h[i]]!=i)
{
f=0;
break;
}
}
if(f==0)
{
puts("-1");
}
else
{
cout<<m<<endl;
for(int i=1;i<=n;i++)
{
cout<<g[i]<<" ";
}
cout<<endl;
for(int i=1;i<=m;i++)
{
cout<<h[i]<<" ";
}
cout<<endl;
}
}
}