只要找到循环节就行了,然后就是模拟了。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,k;
int p[210],vis[210],cnt[210],v[210];
char s[210],per[210];
int main()
{
while(cin>>n&&n)
{
for(int i=0;i<n;i++)
{
cin>>p[i];
p[i]--;
}
memset(vis,0,sizeof(vis));
int c=1;
for(int i=0;i<n;i++) if(!vis[i])
{
int j=i,m=0;
do
{
vis[j]=c;
j=p[j];
m++;
} while(j!=i);
cnt[c++]=m;
}
while(cin>>k&&k)
{
getchar();
cin.getline(s,300);
memset(v,0,sizeof(v));
for(int i=0;i<n;i++) if(!v[i])
{
int tmp=k%cnt[vis[i]];
int j=i;
do
{
int t=tmp,u=j;
v[j]=1;
while(t--) u=p[u];
if(i<strlen(s)) per[u]=s[i];
else per[u]=' ';
} while(j!=i);
}
per[n]=0;
cout<<per<<endl;
}
cout<<endl;
}
return 0;
}