POJ1026 HDU1439 Cipher【置换群】

题目链接:

http://poj.org/problem?id=1026

http://acm.hdu.edu.cn/showproblem.php?pid=1439

 

题目大意:

给定一个 n 元置换 Key,输出一个字符串(长度若小于n则用空格补齐)经过 k 次置换后

的字符串


解题思路:

先求出 Key[i] 每个元素置换到自己本身的次数 ChangeNum[i],如 4 5 3 7 2 8 1 6 10 9

中,4->7->1->4 经过三次到循环,5->2->5 经过两次到循环,7->1->4->7 经过三次

到循环。再将字符串补全,进行 k % ChangeNum[i] 次置换。


AC代码: 

# include "stdio.h"
# include "string.h"

int Key[210], ChangeNum[210];
char Ch[210], AnsCh[210];
int main()
{
    int n, k;
    while(~scanf("%d",&n) && n!=0)
    {
        memset(Key,0,sizeof(Key));
        memset(ChangeNum,0,sizeof(ChangeNum));
        for(int i = 1; i <= n; i++)
            scanf("%d",&Key[i]);
        for(int i = 1; i <= n; i++)
        {
            int num = 1;
            int t = Key[Key[i]];
            while(t!=Key[i])
            {
                num++;
                t = Key[t];
            }
            ChangeNum[i] = num;
        }
        while(scanf("%d",&k) && k!=0)
        {
            getchar();
            memset(Ch,0,sizeof(Ch));
            memset(AnsCh,0,sizeof(AnsCh));
            gets(Ch+1);
            int len = strlen(Ch+1);
            for(int i = len+1; i <= n; i++)
            {
                Ch[i] = ' ';
            }
            Ch[n+1] = '\0';
            for(int i = 1; i <= n; i++)
            {
                int pos = i;
                for(int j = 0; j < k % ChangeNum[i]; j++)
                {
                    pos = Key[pos];
                }
                AnsCh[pos] = Ch[i];
            }
            AnsCh[n+1] = '\0';
            puts(AnsCh+1);
        }
        printf("\n");
    }
    return 0;
}


 

 

 

你可能感兴趣的:(POJ1026 HDU1439 Cipher【置换群】)