codechef Ambiguous Permutations 题解

来源:互联网 发布:淘宝客服容易做吗 编辑:程序博客网 时间:2024/05/16 17:50

Some programming contest problems are really tricky: not only do they
require a different output format from what you might have expected, but
also the sample output does not show the difference. For an example,
let us look at permutations.
permutation of the integers 1 to n is an
ordering of
these integers. So the natural way to represent a permutation is
to list the integers in this order. With n = 5, a
permutation might look like 2, 3, 4, 5, 1. 
However, there is another possibility of representing a permutation:
You create a list of numbers where the i-th number is the
position of the integer i in the permutation.
Let us call this second
possibility an inverse permutation. The inverse permutation
for the sequence above is 5, 1, 2, 3, 4.

An ambiguous permutation is a permutation which cannot be
distinguished from its inverse permutation. The permutation 1, 4, 3, 2
for example is ambiguous, because its inverse permutation is the same.
To get rid of such annoying sample test cases, you have to write a
program which detects if a given permutation is ambiguous or not.

Sample Input

41 4 3 252 3 4 5 1110

Sample Output

ambiguousnot ambiguousambiguous

输入数据也是超大的。最大单列有100000个整数

所以这次使用getchar和fputs来处理数据,速度还不错。

#pragma once#include <stdio.h>int scanInt(){register int res = 0, next = 0;while ((next = getchar()) >= '0' && next <= '9'){res = (res<<3) + (res<<1) + next - '0';}return res;}int AmbiguousPermutations(){char *ambiguous = "ambiguous\n";char *nonAmbiguous = "not ambiguous\n";int n = 0;while ((n = scanInt()) != 0){int *A = new int[n+1];int *B = new int[n+1];for (int i = 1; i <= n; i++){A[i] = scanInt();B[A[i]] = i;}bool isAmbiguous = true;for (int i = 1; i <= n; i++){if (A[i] != B[i]){isAmbiguous = false;break;}}if (isAmbiguous) fputs(ambiguous, stdout);else fputs(nonAmbiguous, stdout);delete [] A;delete [] B;}return 0;}




1 0
原创粉丝点击