首页 > 代码库 > POJ 1026 Cipher(置换群)
POJ 1026 Cipher(置换群)
题目链接
题意 :由n个数字组成的密钥,每个数字都不相同,都在1~n之间,有一份长度小于等于n的信息,要求将信息放到密钥下边,一一对应,信息不足n的时候补空格,然后将位置重新排列,将此过程重复k次,求最后的字符串序列,最后的空格不用输出。
思路 :如果按照最原始的求循环结的话会超时,因为k值范围很大。所以要用置换群,把每个的元素的循环求出来,直接对其取余即可。会3270的话,这个题理解起来挺容易的。
1 //1126 2 #include <stdio.h> 3 #include <string.h> 4 #include <iostream> 5 6 using namespace std ; 7 8 int a[210],ch[210] ; 9 char sh[210] ,pri[210]; 10 11 void xh(int n) 12 { 13 for(int i = 1 ; i <= n ; i++) 14 { 15 int cnt = 1 ; 16 int pos = a[i] ; 17 while(pos != i) 18 { 19 pos = a[pos] ; 20 cnt ++ ; 21 } 22 ch[i] = cnt ; 23 } 24 } 25 int main() 26 { 27 int n,k ; 28 while(~scanf("%d",&n) && n) 29 { 30 memset(a,0,sizeof(a)) ; 31 for(int i = 1 ; i <= n ; i++) 32 scanf("%d",&a[i]) ; 33 //memset(sh,0,sizeof(sh)) ; 34 xh(n) ; 35 while(~scanf("%d",&k) && k) 36 { 37 getchar() ; 38 gets(sh+1) ; 39 for(int i = strlen(sh+1) + 1 ; i <= n ; i++ ) 40 sh[i] = ‘ ‘ ; 41 sh[n+1] = ‘\0‘ ; 42 for(int i = 1 ; i <= n ; i++) 43 { 44 int pos = i ; 45 for(int j = 0 ; j < k % ch[i] ; j ++) 46 pos = a[pos] ; 47 pri[pos] = sh[i] ; 48 } 49 pri[n+1] = ‘\0‘ ; 50 for(int i = 1 ; i <= n ; i++) 51 printf("%c",pri[i]) ; 52 puts("") ; 53 } 54 puts("") ; 55 } 56 return 0 ; 57 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。