预处理出每个位置循环的周期。
按行读入可以写成scanf("%[^\n]",s)
代码:
//
// main.cpp
// 1026 Cipher
//
// Created by Baoli1100 on 15/4/1.
// Copyright (c) 2015年 Baoli1100. All rights reserved.
//
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[205];
int T[205];
int N;
char s[205];
char res[205];
int main(){
while(~scanf("%d",&N)){
if(!N) break;
for(int i=1;i<=N;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<=N;i++){
int cur=a[i];
int t=1;
while(cur!=i){
cur=a[cur];
t++;
}
T[i]=t;
}
int K;
while(~scanf("%d",&K)){
if(!K) break;
scanf("%[^\n]",s);
int pos=strlen(s);
for(int i=pos;i<=N;i++){
s[i]=' ';
}
for(int i=1;i<=N;i++){
int tmp=K%T[i];
int cur=i;
for(int j=0;j<tmp;j++){
cur=a[cur];
}
res[cur]=s[i];
}
for(int i=1;i<=N;i++){
printf("%c",res[i]);
}
printf("\n");
getchar();
}
printf("\n");
}
return 0;
}
1万+



被折叠的 条评论
为什么被折叠?



