0
点赞
收藏
分享

微信扫一扫

POJ1026 HDU1439 Cipher【置换群】

迪莉娅1979 2022-07-27 阅读 19


题目链接:

​​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;
}

 

 

 

举报

相关推荐

0 条评论