POJ 1026 Cipher(置换群)
2014-06-08 21:03
381 查看
题目链接
题意 :由n个数字组成的密钥,每个数字都不相同,都在1~n之间,有一份长度小于等于n的信息,要求将信息放到密钥下边,一一对应,信息不足n的时候补空格,然后将位置重新排列,将此过程重复k次,求最后的字符串序列,最后的空格不用输出。
思路 :如果按照最原始的求循环结的话会超时,因为k值范围很大。所以要用置换群,把每个的元素的循环求出来,直接对其取余即可。会3270的话,这个题理解起来挺容易的。
View Code
题意 :由n个数字组成的密钥,每个数字都不相同,都在1~n之间,有一份长度小于等于n的信息,要求将信息放到密钥下边,一一对应,信息不足n的时候补空格,然后将位置重新排列,将此过程重复k次,求最后的字符串序列,最后的空格不用输出。
思路 :如果按照最原始的求循环结的话会超时,因为k值范围很大。所以要用置换群,把每个的元素的循环求出来,直接对其取余即可。会3270的话,这个题理解起来挺容易的。
//1126 #include <stdio.h> #include <string.h> #include <iostream> using namespace std ; int a[210],ch[210] ; char sh[210] ,pri[210]; void xh(int n) { for(int i = 1 ; i <= n ; i++) { int cnt = 1 ; int pos = a[i] ; while(pos != i) { pos = a[pos] ; cnt ++ ; } ch[i] = cnt ; } } int main() { int n,k ; while(~scanf("%d",&n) && n) { memset(a,0,sizeof(a)) ; for(int i = 1 ; i <= n ; i++) scanf("%d",&a[i]) ; //memset(sh,0,sizeof(sh)) ; xh(n) ; while(~scanf("%d",&k) && k) { getchar() ; gets(sh+1) ; for(int i = strlen(sh+1) + 1 ; i <= n ; i++ ) sh[i] = ' ' ; sh[n+1] = '\0' ; for(int i = 1 ; i <= n ; i++) { int pos = i ; for(int j = 0 ; j < k % ch[i] ; j ++) pos = a[pos] ; pri[pos] = sh[i] ; } pri[n+1] = '\0' ; for(int i = 1 ; i <= n ; i++) printf("%c",pri[i]) ; puts("") ; } puts("") ; } return 0 ; }
View Code
相关文章推荐
- POJ 1026 Cipher(置换群)
- POJ 1026 Cipher 置换群
- poj 1026 Cipher 【置换群】 【求一个字符串经过 k 次置换后 的新字符串】
- 【解题报告】POJ 1026 Cipher -- 置换群 轮换k次
- 【POJ 1026】Cipher(置换群)
- POJ 1026 Cipher(置换群)
- 【置换群】 HDOJ 1439 && POJ 1026 Cipher
- POJ 1026-Cipher(置换群-K次置换 取模循环节长度)
- 【POJ】1026 - Cipher(置换群)
- POJ 1026 Cipher(置换群)循环节
- poj 1026 Cipher(置换群循环节)
- poj_1026 Cipher(置换群)
- poj 1026 Cipher(置换群T_T)
- poj 1026 Cipher (置换群)
- poj1026--Cipher(置换群)
- poj-1026-Cipher-置换群
- poj 1026 Cipher(置换群)
- POJ1026 HDU1439 Cipher【置换群】
- POJ 1026 Cipher (置换群)
- POJ 1026-Cipher(置换群)