码迷,mamicode.com
首页 > 其他好文 > 详细

[BestCoder Round #7] hdu 4985 Little Pony and Permutation (找循环节)

时间:2014-09-01 10:50:33      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:bestcoder   acm   

Little Pony and Permutation




Problem Description
bubuko.com,布布扣

As a unicorn, the ability of using magic is the distinguishing feature among other kind of pony. Being familiar with composition and decomposition is the fundamental course for a young unicorn. Twilight Sparkle is interested in the decomposition of permutations. A permutation of a set S = {1, 2, ..., n} is a bijection from S to itself. In the great magician —— Cauchy‘s two-line notation, one lists the elements of set S in the first row, and then for each element, writes its image under the permutation below it in the second row. For instance, a permutation of set {1, 2, 3, 4, 5} σ can be written as:

bubuko.com,布布扣

Here σ(1) = 2, σ(2) = 5, σ(3) = 4, σ(4) = 3, and σ(5) = 1.
Twilight Sparkle is going to decompose the permutation into some disjoint cycles. For instance, the above permutation can be rewritten as:

bubuko.com,布布扣

Help Twilight Sparkle find the lexicographic smallest solution. (Only considering numbers).
 

Input
Input contains multiple test cases (less than 10). For each test case, the first line contains one number n (1<=n<=10^5). The second line contains n numbers which the i-th of them(start from 1) is σ(i).
 

Output
For each case, output the corresponding result.
 

Sample Input
5 2 5 4 3 1 3 1 2 3
 

Sample Output
(1 2 5)(3 4) (1)(2)(3)
 

Source


解题思路:

找循环节,用while循环就可以了,注意输出格式。

代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
const int maxn=100010;
int num[maxn];
bool vis[maxn];
int n;

void getCircle()
{
    memset(vis,0,sizeof(vis));
    int t;
    bool ok=0;
    for(int i=1;i<=n;i++)
    {
        int temp=i;
        if(!vis[temp])
            printf("(");
        while(!vis[temp])
        {
            t=temp;
            vis[temp]=true;
            temp=num[temp];
            if(!vis[temp])
                printf("%d ",t);
            else
            {
                printf("%d",t);
                ok=1;
            }
        }
        if(ok)
        {
             printf(")");
             ok=0;
        }
    }
    printf("\n");
}


int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&num[i]);
        getCircle();
    }
    return 0;
}


[BestCoder Round #7] hdu 4985 Little Pony and Permutation (找循环节)

标签:bestcoder   acm   

原文地址:http://blog.csdn.net/sr_19930829/article/details/38975797

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!