#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int key[210],T[210];
char Old[210],New[210];
int main(){
int n;
Old[205]='\0';New[205]='\0';
while(scanf("%d",&n)==1&&n){
for(int i=1;i<=n;++i) scanf("%d",&key[i]);
for(int i=1;i<=n;++i){
int t=1,nxt=key[i];
while(nxt!=i) {nxt=key[nxt];t++;}
T[i]=t;
//cout<<T[i]<<endl;
}
int t;
while(scanf("%d",&t)&&t){
int i;
getchar();
for(i=1;i<=n;++i) {scanf("%c",&Old[i]);if(Old[i]=='\n'||Old[i]=='\r') break;}
for(;i<=n;++i) Old[i]=' ';
for(int i=1;i<=n;++i){
int tt=t%T[i],newi=i;
for(int j=0;j<tt;++j){
newi=key[newi];
}
New[newi]=Old[i];
}
strcpy(Old,New);
for(int j=1;j<=n;++j){
printf("%c",New[j]);
}
printf("\n");
}
printf("\n");
}
return 0;
}
直接暴力模拟会超时,最好的方式是对每一项求周期。
其实34行,我最初是想输出Old的,但是发现Old跟最初的没有改变。原来是因为New[0]=’\0’,所以strcpy相当于没有复制。