//============================================================================
// Name : 1026.cpp
// Author : sww
// Version : 1.0
// Time : 2013-11-17 21:36:52
//===========================================================================
#include <stdio.h>
#include <cstring>
using namespace std;
#define N 200
int data[N + 1];
bool use[N + 1];
int sn[N + 1];
int offset[N + 1];
int start[N + 1];
int length[N + 1];
int value[N];
char dd[N + 1];
char out[N + 2];
int count;
int n;
int k;
void output() {
for (int i = 0; i < count; i++) {
printf("length=%d\t",length[i]);
for (int j = start[i]; j < start[i] + length[i]; j++)
printf("%d(%d) ", value[j], j);
puts("");
}
for (int i=1;i<=n;i++){
printf("i=%d\tsn=%d\toffset=%d\n",i,sn[i],offset[i]);
}
}
int getNumber(const int& i) {
int ct = sn[i];
return value[(k + offset[i]) % length[ct] + start[ct]];
}
int main() {
while (true) {
scanf("%d", &n);
if (n == 0)
break;
for (int i = 1; i <= n; i++) {
scanf("%d", &data[i]);
}
memset(use, 0, sizeof(use));
memset(length, 0, sizeof(length));
count = 0;
int st = 0;
for (int i = 1; i <= n; i++) {
if (!use[i]) {
int next = data[i];
start[count] = st;
value[st++] = i;
use[i] = true;
sn[i] = count;
offset[i] = 0;
length[count]++;
while (next != i) {
use[next] = true;
sn[next] = count;
offset[next] = length[count];
value[st++] = next;
next = data[next];
length[count]++;
}
count++;
}
}
// output();
while (true) {
scanf("%d", &k);
if (k == 0) {
puts("");
break;
}
getchar();
st = 1;
while (true) {
dd[st] = getchar();
if (dd[st] == '\n') {
for (; st <= n; st++) {
dd[st] = ' ';
}
break;
}
st++;
}
for (int i = 1; i <= n; i++) {
out[getNumber(i)] = dd[i];
}
out[n+1]='\0';
puts(&out[1]);
}
}
return 0;
}
poj1026
最新推荐文章于 2018-07-14 17:23:09 发布