分析:
理解题意之后,我们计算出轮换的大小
每一位每一位的模拟
第
i
i
位的交换次数
这点零头,我们直接模拟即可
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N=205;
int n,m,a[N],len,c[N],belong[N],cnt;
char s[N],ans[N];
bool p[N];
int init()
{
memset(s,0,sizeof(s));
char c;
c=getchar(); c=getchar();
len=0;
while (c!='\n')
{
s[++len]=c;
c=getchar();
}
for (int i=len+1;i<=n;i++) s[i]=' ';
return 0;
}
int main()
{
while (scanf("%d",&n)!=EOF)
{
memset(p,0,sizeof(p)); cnt=0;
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
for (int i=1;i<=n;i++) if (!p[i]) //计算轮换
{
cnt++;
int x=i,l=0;
do{
l++; p[x]=1; belong[x]=cnt; x=a[x];
}
while (x!=i);
c[cnt]=l;
}
while (scanf("%d",&m)!=EOF&&m)
{
init();
for (int i=1;i<=n;i++)
{
int l=(m%c[belong[i]]);
int x=i;
for (int j=1;j<=l;j++) x=a[x];
ans[x]=s[i];
}
for (int i=1;i<=n;i++) printf("%c",ans[i]);
printf("\n");
}
printf("\n");
}
return 0;
}