标签:des style color os io strong 数据 for
Description
Input
Output
Sample Input
10 4 5 3 7 2 8 1 6 10 9 1 Hello Bob 1995 CERC 0 0
Sample Output
BolHeol b C RCE
解题思路:
读了半天才看懂题意,题目不难,但要静下心去理解。题目大意是先给一串数字, 再给一串信息,信息中的每个字符与给的数字相对应,而对应的数字表示的是该字符应该出现在第几个位置。根据数字调整好字符的位置后相当于编码一次。然后让你求编码k次后的信息是怎样的。
这题必须要找出循环的节点。字符在编码m次后一定会回到原来的位置,这就是一个循环。记录一个循环中每个点的位置。编码次数会给的很大。如果不用循环来做,是会超时的。
注意:这题每组数据输出之间要空一行。
AC代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int main() { int n, k, a[205], m[205][205], huan[205]; //m记录一个循环中每个节点,huan记录每个点多久循环一次 char mes[205], ans[205]; while(scanf("%d", &n) && n) { for(int i = 1; i <= n; i++) scanf("%d", &a[i]); while(scanf("%d", &k) && k) { gets(mes); for(int i = strlen(mes); i <= n; i++) mes[i] = ' '; memset(huan, 0, sizeof(huan)); for(int i = 1; i <= n; i++) { int temp, j; temp = a[i]; j = 1; m[i][j] = temp; while(a[temp] != a[i]) { temp = a[temp]; m[i][++j] = temp; // 记录循环中点的位置 huan[i]++; //只要没有回到原来位置,循环长度加1 } huan[i]++; } for(int i = 1; i <= n; i++) { int p, q; p = k % huan[i]; // 计算循环后的位置 if(p) q = m[i][p]; else q = m[i][huan[i]]; //若能整除说明循环到最后一个 ans[q - 1] = mes[i]; } ans[n] = '\0'; printf("%s\n", ans); } printf("\n"); //每组数据之间要空一行 } return 0; }
标签:des style color os io strong 数据 for
原文地址:http://blog.csdn.net/userluoxuan/article/details/38456009