根据那两个式子

g(h(x))=x

h(g(x))=f(x)

可以推出来两个新的式子

g(f(x))=g(x)

h(x)=f(h(x))

于是,我们先找到f(x)的所有不动点,有几个不动点,m就是多少,将它们依次赋值给h(1),h(2),...,h(m),对应的g(h(i))赋值成1,2,..,m

然后如果对于某个i,g(f(i))不存在的话,则无解,否则有解,将g和h依次输出即可。

#include<cstdio>
using namespace std;
int n,f[100010],g[100010],h[1000010],m;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",&f[i]);
for(int i=1;i<=n;++i)
if(f[i]==i)
{
h[++m]=i;
g[i]=m;
}
if(!m)
{
puts("-1");
return 0;
}
for(int i=1;i<=n;++i)
if(!g[f[i]])
{
puts("-1");
return 0;
}
printf("%d\n",m);
for(int i=1;i<n;++i)
printf("%d ",g[f[i]]);
printf("%d\n",g[f[n]]);
for(int i=1;i<m;++i)
printf("%d ",h[i]);
printf("%d\n",h[m]);
return 0;
}

最新文章

  1. display:table-cell介绍
  2. Python中reactor,factory,protocol
  3. struts2各个jar包的作用
  4. SignalR实时聊天功能
  5. 搜索打表大找规律 (hdu2045)
  6. SOCKET网络编程细节问题1
  7. 使用java语言,将字符串中连续重复出现的字母变成“出现次数“+字母的格式
  8. AJAX获取JSON WEB窗体代码
  9. input框中修改placeholder的样式
  10. JS创建一个数组1.求和 2.求平均值 3.最大值 4.最小值 5.数组逆序 6.数组去重 0.退出
  11. IDEA Spring注入显示红色波浪线
  12. Confluence 6 WebDAV 禁用严格路径检查
  13. python(1):数据类型/string/list/dict/set等
  14. Ubuntu 18.04 安装Docker
  15. Android事件总线(四)源码解析otto
  16. LaTeX技巧10:LaTeX数学公式输入初级入门
  17. zookeeper 知识点汇总
  18. mule学习笔记
  19. zabbix3.0 安装时出现PHP Parse error: syntax error
  20. 最短路径Dijkstra算法(邻接矩阵)

热门文章

  1. Educational Codeforces Round 58 (Rated for Div. 2) 题解
  2. Java Error: Failed to validate certificate. The application will not be executed
  3. 理解PHP链式调用
  4. c++虚析构函数的必要性
  5. SVG布局
  6. [POJ3237]Tree解题报告|树链剖分|边剖
  7. 单源最短路模板_SPFA_Dijkstra(堆优化)_C++
  8. 斜率优化DP讲解
  9. mybatis generator 生成带中文注释的model类
  10. 肢解 HTTP 服务器构建